Data Cleaning and Preprocessing

Exploratory Data Analysis

# Import Dataset
library(readxl)
sample2hotel <- read_excel("~/Desktop/MSBA/FALL II 2023/Data Mining/Project/sample2hotel.xlsx")
## New names:
## • `` -> `...1`
# Check numbers of observations and variable names
num_observations <- nrow(sample2hotel)
paste("Number of observations:", num_observations)
## [1] "Number of observations: 80000"
num_variables <- ncol(sample2hotel)
paste("Number of variables:", num_variables)
## [1] "Number of variables: 32"
# Check variable names
variable_names <- names(sample2hotel)
print(variable_names)
##  [1] "...1"                 "ID"                   "Nationality"         
##  [4] "Age"                  "DaysSinceCreation"    "NameHash"            
##  [7] "DocIDHash"            "AverageLeadTime"      "LodgingRevenue"      
## [10] "OtherRevenue"         "BookingsCanceled"     "BookingsNoShowed"    
## [13] "BookingsCheckedIn"    "PersonsNights"        "RoomNights"          
## [16] "DaysSinceLastStay"    "DaysSinceFirstStay"   "DistributionChannel" 
## [19] "MarketSegment"        "SRHighFloor"          "SRLowFloor"          
## [22] "SRAccessibleRoom"     "SRMediumFloor"        "SRBathtub"           
## [25] "SRShower"             "SRCrib"               "SRKingSizeBed"       
## [28] "SRTwinBed"            "SRNearElevator"       "SRAwayFromElevator"  
## [31] "SRNoAlcoholInMiniBar" "SRQuietRoom"
#summary(sample2hotel)
head(sample2hotel)
## # A tibble: 6 × 32
##    ...1    ID Nationality Age   DaysSinceCreation NameHash             DocIDHash
##   <dbl> <dbl> <chr>       <chr>             <dbl> <chr>                <chr>    
## 1     1 32375 GBR         25                  536 0x644581B68FF7EE913… 0x279AC1…
## 2     2 74084 DEU         39                   94 0x7DD5B780639019C38… 0x101EFE…
## 3     3 37550 ESP         45                  459 0xA1501498BCD3B74CD… 0x653E12…
## 4     4 34105 ESP         43                  509 0xCCDFE4E69CB8A7DFE… 0x6CA492…
## 5     5 19601 DEU         50                  754 0x5C8E30E1AF69162DE… 0x9E8746…
## 6     6 55192 USA         43                  238 0x08325B2C308294D4F… 0x025DAF…
## # ℹ 25 more variables: AverageLeadTime <dbl>, LodgingRevenue <dbl>,
## #   OtherRevenue <dbl>, BookingsCanceled <dbl>, BookingsNoShowed <dbl>,
## #   BookingsCheckedIn <dbl>, PersonsNights <dbl>, RoomNights <dbl>,
## #   DaysSinceLastStay <dbl>, DaysSinceFirstStay <dbl>,
## #   DistributionChannel <chr>, MarketSegment <chr>, SRHighFloor <dbl>,
## #   SRLowFloor <dbl>, SRAccessibleRoom <dbl>, SRMediumFloor <dbl>,
## #   SRBathtub <dbl>, SRShower <dbl>, SRCrib <dbl>, SRKingSizeBed <dbl>, …

Data Cleaning

Duplicate in Dataset

# Check any rows duplicate
has_duplicates <- any(duplicated(sample2hotel))
has_duplicates
## [1] FALSE

The dataset doesn’t have any duplicate rows.

Missing Values in Dataset

sample2hotel$ID <- as.numeric(sample2hotel$ID)
sample2hotel$Age <- as.numeric(sample2hotel$Age)
## Warning: NAs introduced by coercion
sample2hotel$DaysSinceCreation <- as.numeric(sample2hotel$DaysSinceCreation)
sample2hotel$AverageLeadTime <- as.numeric(sample2hotel$AverageLeadTime)
sample2hotel$LodgingRevenue <- as.numeric(sample2hotel$LodgingRevenue)
sample2hotel$OtherRevenue <- as.numeric(sample2hotel$OtherRevenue)
sample2hotel$PersonsNights <- as.numeric(sample2hotel$PersonsNights)
sample2hotel$RoomNights <- as.numeric(sample2hotel$RoomNights)
sample2hotel$DaysSinceLastStay <- as.numeric(sample2hotel$DaysSinceLastStay)
sample2hotel$DaysSinceFirstStay <- as.numeric(sample2hotel$DaysSinceFirstStay)
# Check missing values in the dataset
sample2hotel[sapply(sample2hotel, is.null)] <- NA
total_missing <- sum(is.na(sample2hotel))
paste("Total missing values:", total_missing)
## [1] "Total missing values: 3598"
# Remove rows with NA values
hotel2 <- na.omit(sample2hotel)
hotel2
## # A tibble: 76,402 × 32
##     ...1    ID Nationality   Age DaysSinceCreation NameHash            DocIDHash
##    <dbl> <dbl> <chr>       <dbl>             <dbl> <chr>               <chr>    
##  1     1 32375 GBR            25               536 0x644581B68FF7EE91… 0x279AC1…
##  2     2 74084 DEU            39                94 0x7DD5B780639019C3… 0x101EFE…
##  3     3 37550 ESP            45               459 0xA1501498BCD3B74C… 0x653E12…
##  4     4 34105 ESP            43               509 0xCCDFE4E69CB8A7DF… 0x6CA492…
##  5     5 19601 DEU            50               754 0x5C8E30E1AF69162D… 0x9E8746…
##  6     6 55192 USA            43               238 0x08325B2C308294D4… 0x025DAF…
##  7     7 26236 ESP            29               625 0x7350FADF2956893C… 0x3EC536…
##  8     8 28011 PRT            41               598 0xDFB6D9BC7BAD2C5F… 0x00AB42…
##  9     9 74413 USA            40                92 0x750772601883ADAA… 0xB01AEB…
## 10    10  7409 PRT            54               941 0x824FDB25E6D2030B… 0x291D10…
## # ℹ 76,392 more rows
## # ℹ 25 more variables: AverageLeadTime <dbl>, LodgingRevenue <dbl>,
## #   OtherRevenue <dbl>, BookingsCanceled <dbl>, BookingsNoShowed <dbl>,
## #   BookingsCheckedIn <dbl>, PersonsNights <dbl>, RoomNights <dbl>,
## #   DaysSinceLastStay <dbl>, DaysSinceFirstStay <dbl>,
## #   DistributionChannel <chr>, MarketSegment <chr>, SRHighFloor <dbl>,
## #   SRLowFloor <dbl>, SRAccessibleRoom <dbl>, SRMediumFloor <dbl>, …
# Remove rows with AverageLeadTime less than 0
hotel2 <- hotel2[hotel2$AverageLeadTime >= 0, ]

Inconsistencies in Dataset

#hotel2 <- subset(hotel2, !(BookingsCanceled == 0 & BookingsNoShowed == 0 & BookingsCheckedIn == 0))
# Find inconsistencies in the dataset
typo_hotel2 <- hotel2[hotel2$DaysSinceLastStay == -1 & hotel2$DaysSinceFirstStay == -1, ]

print(typo_hotel2)
## # A tibble: 18,249 × 32
##     ...1    ID Nationality   Age DaysSinceCreation NameHash            DocIDHash
##    <dbl> <dbl> <chr>       <dbl>             <dbl> <chr>               <chr>    
##  1    15 72224 GEO            34               107 0xF285EAB72934A75D… 0xB36C72…
##  2    16 55252 GBR            28               238 0xE280F9F3128CBE7B… 0x8A3433…
##  3    32 81462 SWE            25                27 0x1C19707F0F5032D9… 0xE3C80C…
##  4    36 71223 BEL            60               115 0xC22E5955C439E8A2… 0x76C813…
##  5    39 54401 CAN            54               244 0x85D8293602A6934C… 0xAE30FA…
##  6    46 62513 BEL            43               179 0xD570477846FBF70E… 0x8BE24A…
##  7    48 70212 FRA            35               122 0x8CC1C90A2B6073FF… 0x703CAD…
##  8    50  2767 HRV            48              1025 0x40CF35B99FA16F2F… 0x94A976…
##  9    55 70905 ESP            53               117 0x26AAF3108829064C… 0x5B4981…
## 10    58 80643 ESP            58                38 0xF6E74CD38685D6AB… 0xAC0285…
## # ℹ 18,239 more rows
## # ℹ 25 more variables: AverageLeadTime <dbl>, LodgingRevenue <dbl>,
## #   OtherRevenue <dbl>, BookingsCanceled <dbl>, BookingsNoShowed <dbl>,
## #   BookingsCheckedIn <dbl>, PersonsNights <dbl>, RoomNights <dbl>,
## #   DaysSinceLastStay <dbl>, DaysSinceFirstStay <dbl>,
## #   DistributionChannel <chr>, MarketSegment <chr>, SRHighFloor <dbl>,
## #   SRLowFloor <dbl>, SRAccessibleRoom <dbl>, SRMediumFloor <dbl>, …
# Correct typping errors
hotel2$DaysSinceLastStay <- ifelse(hotel2$DaysSinceLastStay == -1, 1, hotel2$DaysSinceLastStay)
hotel2$DaysSinceFirstStay <- ifelse(hotel2$DaysSinceFirstStay == -1, 1, hotel2$DaysSinceFirstStay)

Outliers in Dataset

# Boxplot of Age, DaysSinceCreation, AverageLeadTime, LodgingRevenue, OtherRevenue,BookingsCanceled, BookingsNoShowed, BookingsCheckedIn, PersonsNights, RoomNights, DaysSinceLastStay, DaysSinceFirstStay

boxplot(hotel2$Age, main = "Box Plot of Age", ylab = "Age")

boxplot(hotel2$DaysSinceCreation, main = "Box Plot of DaysSinceCreation", ylab = "DaysSinceCreation")

boxplot(hotel2$AverageLeadTime, main = "Box Plot of AverageLeadTime", ylab = "AverageLeadTime")

boxplot(hotel2$LodgingRevenue, main = "Box Plot of LodgingRevenue", ylab = "LodgingRevenue")

boxplot(hotel2$OtherRevenue, main = "Box Plot of OtherRevenue", ylab = "OtherRevenue")

boxplot(hotel2$BookingsCanceled, main = "Box Plot of BookingsCanceled", ylab = "BookingsCanceled")

boxplot(hotel2$BookingsNoShowed, main = "Box Plot of BookingsNoShowed", ylab = "BookingsNoShowed")

boxplot(hotel2$BookingsCheckedIn, main = "Box Plot of BookingsCheckedIn", ylab = "BookingsCheckedIn")

boxplot(hotel2$PersonsNights, main = "Box Plot of PersonsNights", ylab = "PersonsNights")

boxplot(hotel2$RoomNights, main = "Box Plot of RoomNights", ylab = "RoomNights")

boxplot(hotel2$DaysSinceLastStay, main = "Box Plot of DaysSinceLastStay", ylab = "DaysSinceLastStay")

boxplot(hotel2$DaysSinceFirstStay, main = "Box Plot of DaysSinceFirstStay", ylab = "DaysSinceFirstStay")

Outliers are identified in the boxplot of Age, AverageLeadTime, LodgingRevenue, OtherRevenue, PersonsNights, and RoomNights.

Summary Statistics

summarystatistics_numericvariables <- data.frame(
  Variable = c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay"),
  Count = sapply(hotel2[, c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay")], function(x) sum(!is.na(x))),
  Mean = sapply(hotel2[, c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay")], mean, na.rm = TRUE),
  Std = sapply(hotel2[, c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay")], sd, na.rm = TRUE),
  Min = sapply(hotel2[, c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay")], min, na.rm = TRUE),
  Q1 = sapply(hotel2[, c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay")], quantile, prob = 0.25, na.rm = TRUE),
  Median = sapply(hotel2[, c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay")], median, na.rm = TRUE),
  Q3 = sapply(hotel2[, c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay")], quantile, prob = 0.75, na.rm = TRUE),
  Max = sapply(hotel2[, c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay")], max, na.rm = TRUE)
)


summarystatistics_numericvariables$Mean <- round(summarystatistics_numericvariables$Mean, 2)
summarystatistics_numericvariables$Std <- round(summarystatistics_numericvariables$Std, 2)
summarystatistics_numericvariables$Min <- round(summarystatistics_numericvariables$Min, 2)
summarystatistics_numericvariables$Q1 <- round(summarystatistics_numericvariables$Q1, 2)
summarystatistics_numericvariables$Median <- round(summarystatistics_numericvariables$Median, 2)
summarystatistics_numericvariables$Q3 <- round(summarystatistics_numericvariables$Q3, 2)
summarystatistics_numericvariables$Max <- round(summarystatistics_numericvariables$Max, 2)

# Print the summary table
print(summarystatistics_numericvariables)
##                              Variable Count   Mean    Std Min  Q1 Median     Q3
## Age                               Age 76394  45.39  16.57 -11  34   46.0  57.00
## DaysSinceCreation   DaysSinceCreation 76394 446.57 310.78   0 174  384.0 703.75
## AverageLeadTime       AverageLeadTime 76394  66.78  87.93   0   0   30.0 104.00
## LodgingRevenue         LodgingRevenue 76394 302.40 369.26   0  64  236.0 407.40
## OtherRevenue             OtherRevenue 76394  68.02 113.29   0   2   39.5  88.50
## BookingsCanceled     BookingsCanceled 76394   0.00   0.06   0   0    0.0   0.00
## BookingsNoShowed     BookingsNoShowed 76394   0.00   0.03   0   0    0.0   0.00
## BookingsCheckedIn   BookingsCheckedIn 76394   0.79   0.69   0   1    1.0   1.00
## PersonsNights           PersonsNights 76394   4.70   4.59   0   1    4.0   8.00
## RoomNights                 RoomNights 76394   2.38   2.20   0   1    2.0   4.00
## DaysSinceLastStay   DaysSinceLastStay 76394 394.95 343.28   0  25  349.0 679.00
## DaysSinceFirstStay DaysSinceFirstStay 76394 397.17 344.03   1  26  357.0 683.00
##                        Max
## Age                 122.00
## DaysSinceCreation  1095.00
## AverageLeadTime     588.00
## LodgingRevenue     9682.40
## OtherRevenue       7730.25
## BookingsCanceled      9.00
## BookingsNoShowed      3.00
## BookingsCheckedIn    66.00
## PersonsNights       116.00
## RoomNights          116.00
## DaysSinceLastStay  1104.00
## DaysSinceFirstStay 1117.00

Remove Outliers identified in the boxplot of Age

# Calculate the quartiles and IQR : `Age`
Q1 <- quantile(hotel2$Age, 0.25)
Q3 <- quantile(hotel2$Age, 0.75)
IQR <- Q3 - Q1

# Define the lower and upper bounds for potential outliers
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR

# Extract potential outliers
outliers <- hotel2$Age[hotel2$Age < lower_bound | hotel2$Age > upper_bound]

# Create a data frame with the outliers
outliers_age_df <- data.frame(Outlier = outliers)

# View the data frame
#print(outliers_age_df)
# Remove the outliers in Age from the data frame
hotel2 <- hotel2[hotel2$Age > lower_bound & hotel2$Age < upper_bound, ]

#print(hotel2)

Remove Outliers Identified in AverageLeadTime

# Calculate the quartiles and IQR : `AverageLeadTime`
Q1 <- quantile(hotel2$AverageLeadTime, 0.25)
Q3 <- quantile(hotel2$AverageLeadTime, 0.75)
IQR <- Q3 - Q1

# Define the lower and upper bounds for potential outliers
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR

# Extract potential outliers
outliers <- hotel2$AverageLeadTime[hotel2$AverageLeadTime < lower_bound | hotel2$AverageLeadTime > upper_bound]

# Create a data frame with the outliers
outliers_AverageLeadTime_df <- data.frame(Outlier = outliers)

# View the data frame
#print(outliers_AverageLeadTime_df)
# Remove potential outliers in AverageLeadTime from the data frame
hotel2 <- hotel2[hotel2$AverageLeadTime > lower_bound & hotel2$AverageLeadTime < upper_bound, ]

# Print the updated data frame
#print(hotel2)
# Calculate the quartiles and IQR: `LodgingRevenue`

Q1 <- quantile(hotel2$LodgingRevenue, 0.25)
Q3 <- quantile(hotel2$LodgingRevenue, 0.75)
IQR <- Q3 - Q1

# Define the lower and upper bounds for potential outliers
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR

# Extract potential outliers
outliers <- hotel2$LodgingRevenue[hotel2$LodgingRevenue < lower_bound | hotel2$LodgingRevenue > upper_bound]

# Create a data frame with the outliers
outliers_LodgingRevenue_df <- data.frame(Outlier = outliers)

# View the data frame
#print(outliers_LodgingRevenue_df)
hist(hotel2$LodgingRevenue, 
     main = "Histogram of LodgingRevenue",
     xlab = "LodgingRevenue",
     ylab = "Frequency",
     col = "skyblue",
     border = "black")

# Add x-axis labels at specified intervals
axis(1, at = seq(0, max(hotel2$LodgingRevenue), by = 5))

# Add text labels with values on the bars
text(
  x = pretty(hotel2$LodgingRevenue),
  y = hist(hotel2$LodgingRevenue, plot = FALSE)$counts,
  label = hist(hotel2$LodgingRevenue, plot = FALSE)$counts,
  pos = 3,
  cex = 0.8,
  col = "darkred"
)

hotel2 <- hotel2[hotel2$LodgingRevenue >= 55, ]
hotel2 <- hotel2[hotel2$PersonsNights > 0, ]
hotel2 <- hotel2[hotel2$Age >= 18, ]
# Remove potential outliers from the data frame
hotel2 <- hotel2[hotel2$LodgingRevenue > lower_bound & hotel2$LodgingRevenue < upper_bound, ]

# Print the updated data frame
#print(hotel2)
# Calculate the quartiles and IQR: OtherRevenue
Q1 <- quantile(hotel2$OtherRevenue, 0.25)
Q3 <- quantile(hotel2$OtherRevenue, 0.75)
IQR <- Q3 - Q1

# Define the lower and upper bounds for potential outliers
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR

# Extract potential outliers
outliers <- hotel2$OtherRevenue[hotel2$OtherRevenue < lower_bound | hotel2$OtherRevenue > upper_bound]

# Create a data frame with the outliers
outliers_OtherRevenue_df <- data.frame(Outlier = outliers)

# View the data frame
#print(outliers_OtherRevenue_df)

# Remove the outliers in OtherRevenue from the data frame
hotel2 <- hotel2[hotel2$OtherRevenue >= lower_bound & hotel2$OtherRevenue <= upper_bound, ]

# Print the updated data frame
#print(hotel2)
# Calculate the quartiles and IQR: RoomNights
Q1 <- quantile(hotel2$RoomNights, 0.25)
Q3 <- quantile(hotel2$RoomNights, 0.75)
IQR <- Q3 - Q1

# Define the lower and upper bounds for potential outliers
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR

# Extract potential outliers
outliers <- hotel2$RoomNights[hotel2$RoomNights < lower_bound | hotel2$RoomNights > upper_bound]

# Create a data frame with the outliers
#outliers_RoomNights_df <- data.frame(Outlier = outliers)

# View the data frame
#print(outliers_RoomNights_df)

# Remove the outliers in RoomNights from the data frame
hotel2 <- hotel2[hotel2$RoomNights > lower_bound & hotel2$RoomNights < upper_bound, ]

# Print the updated data frame
#print(hotel2)
# Calculate the quartiles and IQR: PersonsNights
Q1 <- quantile(hotel2$PersonsNights, 0.25)
Q3 <- quantile(hotel2$PersonsNights, 0.75)
IQR <- Q3 - Q1

# Define the lower and upper bounds for potential outliers
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR

# Extract potential outliers
outliers <- hotel2$PersonsNights[hotel2$PersonsNights < lower_bound | hotel2$PersonsNights > upper_bound]

# Create a data frame with the outliers
outliers_PersonsNights_df <- data.frame(Outlier = outliers)

# View the data frame
print(outliers_PersonsNights_df)
##     Outlier
## 1        20
## 2        18
## 3        16
## 4        20
## 5        20
## 6        18
## 7        16
## 8        16
## 9        18
## 10       16
## 11       16
## 12       18
## 13       16
## 14       18
## 15       20
## 16       16
## 17       18
## 18       20
## 19       16
## 20       18
## 21       16
## 22       16
## 23       16
## 24       20
## 25       16
## 26       18
## 27       16
## 28       16
## 29       16
## 30       20
## 31       20
## 32       16
## 33       24
## 34       16
## 35       16
## 36       20
## 37       20
## 38       20
## 39       16
## 40       18
## 41       16
## 42       18
## 43       18
## 44       16
## 45       18
## 46       16
## 47       20
## 48       16
## 49       18
## 50       16
## 51       16
## 52       16
## 53       18
## 54       16
## 55       16
## 56       16
## 57       16
## 58       24
## 59       16
## 60       16
## 61       16
## 62       16
## 63       16
## 64       16
## 65       16
## 66       16
## 67       20
## 68       18
## 69       20
## 70       18
## 71       16
## 72       18
## 73       16
## 74       16
## 75       16
## 76       18
## 77       20
## 78       18
## 79       24
## 80       16
## 81       16
## 82       18
## 83       16
## 84       16
## 85       16
## 86       18
## 87       18
## 88       18
## 89       18
## 90       16
## 91       18
## 92       16
## 93       16
## 94       16
## 95       16
## 96       18
## 97       20
## 98       18
## 99       16
## 100      16
## 101      18
## 102      16
## 103      18
## 104      16
## 105      18
## 106      20
## 107      16
## 108      16
## 109      16
## 110      18
## 111      18
## 112      24
## 113      20
## 114      16
## 115      16
## 116      16
## 117      16
## 118      20
## 119      16
## 120      18
## 121      16
## 122      16
## 123      16
## 124      16
## 125      16
## 126      18
## 127      18
## 128      18
## 129      18
## 130      20
## 131      18
## 132      20
## 133      18
## 134      16
## 135      18
## 136      20
## 137      20
## 138      18
## 139      16
## 140      18
## 141      16
## 142      16
## 143      16
## 144      18
## 145      16
## 146      18
## 147      16
## 148      18
## 149      16
## 150      16
## 151      16
## 152      16
## 153      16
## 154      16
## 155      20
## 156      16
## 157      16
## 158      20
## 159      18
## 160      16
## 161      16
## 162      18
## 163      16
## 164      16
## 165      16
## 166      18
## 167      16
## 168      20
## 169      20
## 170      20
## 171      24
## 172      18
## 173      16
## 174      18
## 175      24
## 176      16
## 177      16
## 178      16
## 179      24
## 180      18
## 181      18
## 182      16
## 183      16
## 184      16
## 185      16
## 186      18
## 187      16
## 188      16
## 189      18
## 190      16
## 191      18
## 192      18
## 193      20
## 194      16
## 195      16
## 196      18
## 197      20
## 198      16
## 199      16
## 200      24
## 201      16
## 202      18
## 203      16
## 204      18
## 205      16
## 206      16
## 207      18
## 208      18
## 209      24
## 210      16
## 211      18
## 212      20
## 213      20
## 214      16
## 215      18
## 216      18
## 217      16
## 218      16
## 219      16
## 220      18
## 221      18
## 222      18
## 223      16
## 224      18
## 225      18
## 226      16
## 227      16
## 228      18
## 229      18
## 230      16
## 231      16
## 232      16
## 233      24
## 234      16
## 235      16
## 236      18
## 237      16
## 238      16
## 239      16
## 240      16
## 241      18
## 242      18
## 243      20
## 244      16
## 245      16
## 246      20
## 247      16
## 248      18
## 249      18
## 250      16
## 251      18
## 252      20
## 253      16
## 254      18
## 255      18
## 256      16
## 257      18
## 258      16
## 259      16
## 260      16
## 261      18
## 262      18
## 263      16
## 264      16
## 265      16
## 266      16
## 267      16
## 268      18
## 269      18
## 270      18
## 271      18
## 272      16
## 273      20
## 274      18
## 275      18
## 276      18
## 277      16
## 278      18
## 279      17
## 280      18
## 281      18
## 282      16
## 283      18
## 284      18
## 285      18
## 286      18
## 287      16
## 288      18
## 289      18
## 290      18
## 291      16
## 292      18
## 293      18
## 294      20
## 295      20
## 296      20
## 297      16
## 298      16
## 299      18
## 300      18
## 301      16
## 302      16
## 303      16
## 304      16
# Remove the outliers in PersonsNights from the data frame
hotel2 <- hotel2[hotel2$PersonsNights > lower_bound & hotel2$PersonsNights < upper_bound, ]

# Print the updated data frame
#print(hotel2)
count_rows <- sum(hotel2$DaysSinceLastStay == 1 & hotel2$DaysSinceFirstStay == 1)
print(paste("Number of rows with DaysSinceLastStay == 1 and DaysSinceFirstStay == 1:", count_rows))
## [1] "Number of rows with DaysSinceLastStay == 1 and DaysSinceFirstStay == 1: 2"
hotel2 <- hotel2[!(hotel2$DaysSinceLastStay == 1 & hotel2$DaysSinceFirstStay == 1), ]

Visualizing distributions of Categorical Variables

options(repos = c(CRAN = "https://cran.rstudio.com/"))
install.packages('ggplot2')
## 
## The downloaded binary packages are in
##  /var/folders/q6/vr1t5vmx405cg6xfgtcl3np80000gn/T//RtmpmCK8A5/downloaded_packages
library(ggplot2)
categorical_variables <- c(
  "SRHighFloor", "SRLowFloor", "SRAccessibleRoom", "SRMediumFloor", 
  "SRBathtub", "SRShower", "SRCrib", "SRKingSizeBed", "SRTwinBed",
  "SRNearElevator", "SRAwayFromElevator", "SRNoAlcoholInMiniBar", "SRQuietRoom"
)

for (variable in categorical_variables) {
  plot <- ggplot(data = hotel2, aes(x = hotel2[[variable]])) +
    geom_bar() +
    labs(title = variable, x = "Categories", y = "Frequency")
  
  print(plot)
}
## Warning: Use of `hotel2[[variable]]` is discouraged.
## ℹ Use `.data[[variable]]` instead.

## Warning: Use of `hotel2[[variable]]` is discouraged.
## ℹ Use `.data[[variable]]` instead.

## Warning: Use of `hotel2[[variable]]` is discouraged.
## ℹ Use `.data[[variable]]` instead.

## Warning: Use of `hotel2[[variable]]` is discouraged.
## ℹ Use `.data[[variable]]` instead.

## Warning: Use of `hotel2[[variable]]` is discouraged.
## ℹ Use `.data[[variable]]` instead.

## Warning: Use of `hotel2[[variable]]` is discouraged.
## ℹ Use `.data[[variable]]` instead.

## Warning: Use of `hotel2[[variable]]` is discouraged.
## ℹ Use `.data[[variable]]` instead.

## Warning: Use of `hotel2[[variable]]` is discouraged.
## ℹ Use `.data[[variable]]` instead.

## Warning: Use of `hotel2[[variable]]` is discouraged.
## ℹ Use `.data[[variable]]` instead.

## Warning: Use of `hotel2[[variable]]` is discouraged.
## ℹ Use `.data[[variable]]` instead.

## Warning: Use of `hotel2[[variable]]` is discouraged.
## ℹ Use `.data[[variable]]` instead.

## Warning: Use of `hotel2[[variable]]` is discouraged.
## ℹ Use `.data[[variable]]` instead.

## Warning: Use of `hotel2[[variable]]` is discouraged.
## ℹ Use `.data[[variable]]` instead.

Data Transformation

Data Reduction

hotel2 <- hotel2[, !(names(hotel2) %in% c("NameHash", "DocIDHash"))]
# hotel2 <- hotel2[, !(names(hotel2) %in% c("ID"))]

Create New variables in the Data

Create TotalRevenue

hotel2$TotalRevenue <- hotel2$LodgingRevenue + hotel2$OtherRevenue
# Calculate the quartiles and IQR: TotalRevenue
#Q1 <- quantile(hotel2$TotalRevenue, 0.25)
#Q3 <- quantile(hotel2$TotalRevenue, 0.75)
#IQR <- Q3 - Q1

# Define the lower and upper bounds for potential outliers
#lower_bound <- Q1 - 1.5 * IQR
#upper_bound <- Q3 + 1.5 * IQR

# Extract potential outliers
#outliers <- hotel2$TotalRevenue[hotel2$TotalRevenue < lower_bound | hotel2$TotalRevenue > upper_bound]

# Create a data frame with the outliers
#outliers_TotalRevenue_df <- data.frame(Outlier = outliers)

# View the data frame
#print(outliers_TotalRevenue_df)

# Remove the outliers in TotalRevenue from the data frame
#hotel2 <- hotel2[hotel2$TotalRevenue > lower_bound & hotel2$TotalRevenue < upper_bound, ]

# Print the updated data frame
#print(hotel2)

Create RatePerNight

#hotel2$AverageSpendingDaily <- round(hotel2$AverageSpendingDaily, 2)
hotel2$RatePerNight <- (hotel2$LodgingRevenue / (hotel2$RoomNights))
hotel2$RatePerNight <- round(hotel2$RatePerNight, 2)

**Create AgeGroups

# Create age groups
hotel2$AgeGroups <- cut(hotel2$Age, 
                          breaks = c(0, 30, 45, 60, Inf),
                          labels = c("Under 30", "31-45", "46-60", "60+"),
                          include.lowest = TRUE)

# View the first few rows of the dataset with age groups
#head(hotel2[c("Age", "AgeGroups")])
str(hotel2)
## tibble [46,179 × 33] (S3: tbl_df/tbl/data.frame)
##  $ ...1                : num [1:46179] 1 2 3 4 5 6 7 8 9 10 ...
##  $ ID                  : num [1:46179] 32375 74084 37550 34105 19601 ...
##  $ Nationality         : chr [1:46179] "GBR" "DEU" "ESP" "ESP" ...
##  $ Age                 : num [1:46179] 25 39 45 43 50 43 29 41 40 54 ...
##  $ DaysSinceCreation   : num [1:46179] 536 94 459 509 754 238 625 598 92 941 ...
##  $ AverageLeadTime     : num [1:46179] 48 36 20 129 50 69 64 2 136 2 ...
##  $ LodgingRevenue      : num [1:46179] 213 157 124 560 238 ...
##  $ OtherRevenue        : num [1:46179] 41.5 50 11 68 60 56 46 84.3 14 7 ...
##  $ BookingsCanceled    : num [1:46179] 0 0 0 0 0 0 0 0 0 0 ...
##  $ BookingsNoShowed    : num [1:46179] 0 0 0 0 0 0 0 0 0 0 ...
##  $ BookingsCheckedIn   : num [1:46179] 1 1 1 1 1 1 1 1 1 1 ...
##  $ PersonsNights       : num [1:46179] 6 4 1 12 4 8 4 3 2 1 ...
##  $ RoomNights          : num [1:46179] 3 2 1 4 4 4 2 3 2 1 ...
##  $ DaysSinceLastStay   : num [1:46179] 539 96 460 513 758 242 627 601 94 942 ...
##  $ DaysSinceFirstStay  : num [1:46179] 539 96 460 513 758 242 627 601 94 942 ...
##  $ DistributionChannel : chr [1:46179] "Travel Agent/Operator" "Travel Agent/Operator" "Electronic Distribution" "Direct" ...
##  $ MarketSegment       : chr [1:46179] "Travel Agent/Operator" "Other" "Other" "Direct" ...
##  $ SRHighFloor         : num [1:46179] 0 0 0 0 0 0 0 0 0 0 ...
##  $ SRLowFloor          : num [1:46179] 0 0 0 0 0 0 0 0 0 0 ...
##  $ SRAccessibleRoom    : num [1:46179] 0 0 0 0 0 0 0 0 0 0 ...
##  $ SRMediumFloor       : num [1:46179] 0 0 0 0 0 0 0 0 0 0 ...
##  $ SRBathtub           : num [1:46179] 0 0 0 0 0 0 0 0 0 0 ...
##  $ SRShower            : num [1:46179] 0 0 0 0 0 0 0 0 0 0 ...
##  $ SRCrib              : num [1:46179] 0 0 0 1 0 0 0 0 0 0 ...
##  $ SRKingSizeBed       : num [1:46179] 0 1 0 1 0 0 1 1 1 0 ...
##  $ SRTwinBed           : num [1:46179] 0 0 0 0 0 1 0 0 0 0 ...
##  $ SRNearElevator      : num [1:46179] 0 0 0 0 0 0 0 0 0 0 ...
##  $ SRAwayFromElevator  : num [1:46179] 0 0 0 0 0 0 0 0 0 0 ...
##  $ SRNoAlcoholInMiniBar: num [1:46179] 0 0 0 0 0 0 0 0 0 0 ...
##  $ SRQuietRoom         : num [1:46179] 0 0 0 0 0 0 1 1 0 0 ...
##  $ TotalRevenue        : num [1:46179] 255 207 135 628 298 ...
##  $ RatePerNight        : num [1:46179] 71.1 78.4 124 140 59.5 ...
##  $ AgeGroups           : Factor w/ 4 levels "Under 30","31-45",..: 1 2 2 2 3 2 1 2 2 3 ...
##  - attr(*, "na.action")= 'omit' Named int [1:3598] 77 89 100 114 133 180 186 242 273 283 ...
##   ..- attr(*, "names")= chr [1:3598] "77" "89" "100" "114" ...
# Convert numerical variables to binary categorical variables
variables_convert <- c("SRHighFloor",
  "SRLowFloor", "SRAccessibleRoom", "SRMediumFloor",
  "SRBathtub", "SRShower", "SRCrib", "SRKingSizeBed",
  "SRTwinBed", "SRNearElevator", "SRAwayFromElevator",
  "SRNoAlcoholInMiniBar", "SRQuietRoom"
)

hotel2[variables_convert] <- lapply(hotel2[variables_convert], as.factor)

#print(hotel2)
variable_types <- sapply(hotel2, class)
variable_types_df <- data.frame(VariableName = names(variable_types), DataType = variable_types)
print(variable_types_df)
##                              VariableName  DataType
## ...1                                 ...1   numeric
## ID                                     ID   numeric
## Nationality                   Nationality character
## Age                                   Age   numeric
## DaysSinceCreation       DaysSinceCreation   numeric
## AverageLeadTime           AverageLeadTime   numeric
## LodgingRevenue             LodgingRevenue   numeric
## OtherRevenue                 OtherRevenue   numeric
## BookingsCanceled         BookingsCanceled   numeric
## BookingsNoShowed         BookingsNoShowed   numeric
## BookingsCheckedIn       BookingsCheckedIn   numeric
## PersonsNights               PersonsNights   numeric
## RoomNights                     RoomNights   numeric
## DaysSinceLastStay       DaysSinceLastStay   numeric
## DaysSinceFirstStay     DaysSinceFirstStay   numeric
## DistributionChannel   DistributionChannel character
## MarketSegment               MarketSegment character
## SRHighFloor                   SRHighFloor    factor
## SRLowFloor                     SRLowFloor    factor
## SRAccessibleRoom         SRAccessibleRoom    factor
## SRMediumFloor               SRMediumFloor    factor
## SRBathtub                       SRBathtub    factor
## SRShower                         SRShower    factor
## SRCrib                             SRCrib    factor
## SRKingSizeBed               SRKingSizeBed    factor
## SRTwinBed                       SRTwinBed    factor
## SRNearElevator             SRNearElevator    factor
## SRAwayFromElevator     SRAwayFromElevator    factor
## SRNoAlcoholInMiniBar SRNoAlcoholInMiniBar    factor
## SRQuietRoom                   SRQuietRoom    factor
## TotalRevenue                 TotalRevenue   numeric
## RatePerNight                 RatePerNight   numeric
## AgeGroups                       AgeGroups    factor
# Check numbers of observations and variable names
num_observations <- nrow(hotel2)
paste("Number of observations:", num_observations)
## [1] "Number of observations: 46179"
num_variables <- ncol(hotel2)
paste("Number of variables:", num_variables)
## [1] "Number of variables: 33"
summarystatistics_numericvariables <- data.frame(
  Variable = c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue","TotalRevenue", "RatePerNight", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay"),
  Count = sapply(hotel2[, c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue","TotalRevenue", "RatePerNight", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay")], function(x) sum(!is.na(x))),
  Mean = sapply(hotel2[, c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue","TotalRevenue", "RatePerNight", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay")], mean, na.rm = TRUE),
  Std = sapply(hotel2[, c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue","TotalRevenue", "RatePerNight", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay")], sd, na.rm = TRUE),
  Min = sapply(hotel2[, c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue","TotalRevenue", "RatePerNight", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay")], min, na.rm = TRUE),
  Q1 = sapply(hotel2[, c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue","TotalRevenue", "RatePerNight", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay")], quantile, prob = 0.25, na.rm = TRUE),
  Median = sapply(hotel2[, c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue","TotalRevenue", "RatePerNight", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay")], median, na.rm = TRUE),
  Q3 = sapply(hotel2[, c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue","TotalRevenue", "RatePerNight", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay")], quantile, prob = 0.75, na.rm = TRUE),
  Max = sapply(hotel2[, c("Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue","TotalRevenue", "RatePerNight", "BookingsCanceled", "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay")], max, na.rm = TRUE)
)


summarystatistics_numericvariables$Mean <- round(summarystatistics_numericvariables$Mean, 2)
summarystatistics_numericvariables$Std <- round(summarystatistics_numericvariables$Std, 2)
summarystatistics_numericvariables$Min <- round(summarystatistics_numericvariables$Min, 2)
summarystatistics_numericvariables$Q1 <- round(summarystatistics_numericvariables$Q1, 2)
summarystatistics_numericvariables$Median <- round(summarystatistics_numericvariables$Median, 2)
summarystatistics_numericvariables$Q3 <- round(summarystatistics_numericvariables$Q3, 2)
summarystatistics_numericvariables$Max <- round(summarystatistics_numericvariables$Max, 2)

# Print the summary table
print(summarystatistics_numericvariables)
##                              Variable Count   Mean    Std   Min  Q1 Median
## Age                               Age 46179  46.91  13.92 18.00  36   47.0
## DaysSinceCreation   DaysSinceCreation 46179 521.95 304.24  0.00 251  525.0
## AverageLeadTime       AverageLeadTime 46179  71.20  66.60  0.00  14   51.0
## LodgingRevenue         LodgingRevenue 46179 314.19 178.59 55.00 177  282.0
## OtherRevenue             OtherRevenue 46179  58.81  46.21  0.00  23   46.5
## TotalRevenue             TotalRevenue 46179 373.00 202.39 56.76 220  345.3
## RatePerNight             RatePerNight 46179 120.82  63.75 13.80  83  108.0
## BookingsCanceled     BookingsCanceled 46179   0.00   0.03  0.00   0    0.0
## BookingsNoShowed     BookingsNoShowed 46179   0.00   0.02  0.00   0    0.0
## BookingsCheckedIn   BookingsCheckedIn 46179   1.02   0.16  1.00   1    1.0
## PersonsNights           PersonsNights 46179   5.27   3.04  1.00   3    5.0
## RoomNights                 RoomNights 46179   2.74   1.28  1.00   2    3.0
## DaysSinceLastStay   DaysSinceLastStay 46179 523.04 304.19  0.00 252  525.0
## DaysSinceFirstStay DaysSinceFirstStay 46179 524.67 304.24  2.00 253  528.0
##                        Q3     Max
## Age                 57.00   91.00
## DaysSinceCreation  791.00 1095.00
## AverageLeadTime    112.00  259.00
## LodgingRevenue     410.00 1018.50
## OtherRevenue        83.90  207.20
## TotalRevenue       485.00 1221.40
## RatePerNight       137.82  988.75
## BookingsCanceled     0.00    2.00
## BookingsNoShowed     0.00    2.00
## BookingsCheckedIn    1.00    6.00
## PersonsNights        8.00   15.00
## RoomNights           4.00    6.00
## DaysSinceLastStay  793.00 1100.00
## DaysSinceFirstStay 794.00 1100.00

Data Visualizations

# Top 10 nationalities of tourists visited the hotel
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Create a summary table of the top 10 nationalities and their frequencies
top50_nationalities <- hotel2 %>%
  count(Nationality, sort = TRUE) %>%
  head(50)

# View the top nationalities
print(top50_nationalities)
## # A tibble: 50 × 2
##    Nationality     n
##    <chr>       <int>
##  1 FRA          7035
##  2 PRT          5365
##  3 DEU          5357
##  4 GBR          4898
##  5 ESP          3199
##  6 ITA          1980
##  7 USA          1948
##  8 BEL          1678
##  9 NLD          1604
## 10 BRA          1559
## # ℹ 40 more rows
ggplot(hotel2, aes(x = factor(AgeGroups), fill = factor(AgeGroups))) +
  geom_bar() +
  labs(title = "Distribution of Age Groups", x = "Age Groups", y = "Frequency") +
  theme_minimal() +
  theme(panel.grid = element_blank(),
        text = element_text(size = 14)) +  
  scale_fill_discrete()

library(dplyr)
hotel2 %>%
  summarise(
    across(
      c(SRHighFloor, SRLowFloor, SRAccessibleRoom, SRMediumFloor,
        SRBathtub, SRShower, SRCrib, SRKingSizeBed, SRTwinBed,
        SRNearElevator, SRAwayFromElevator, SRNoAlcoholInMiniBar, SRQuietRoom),
      list(
        Count_No = ~sum(. == 0),
        Count_Yes = ~sum(. == 1)
      )
    )
  )
## # A tibble: 1 × 26
##   SRHighFloor_Count_No SRHighFloor_Count_Yes SRLowFloor_Count_No
##                  <int>                 <int>               <int>
## 1                44100                  2079               46122
## # ℹ 23 more variables: SRLowFloor_Count_Yes <int>,
## #   SRAccessibleRoom_Count_No <int>, SRAccessibleRoom_Count_Yes <int>,
## #   SRMediumFloor_Count_No <int>, SRMediumFloor_Count_Yes <int>,
## #   SRBathtub_Count_No <int>, SRBathtub_Count_Yes <int>,
## #   SRShower_Count_No <int>, SRShower_Count_Yes <int>, SRCrib_Count_No <int>,
## #   SRCrib_Count_Yes <int>, SRKingSizeBed_Count_No <int>,
## #   SRKingSizeBed_Count_Yes <int>, SRTwinBed_Count_No <int>, …
library(tidyr)
hotel2 %>%
  pivot_longer(
    cols = c(BookingsCanceled, BookingsNoShowed, BookingsCheckedIn),
    names_to = "Variable",
    values_to = "Value"
  ) %>%
  group_by(Variable, Value) %>%
  summarise(
    Percentage = n() / nrow(hotel2) * 100
  ) %>%
  pivot_wider(
    names_from = Value,
    values_from = Percentage,
    names_prefix = "Count_"
  )
## `summarise()` has grouped output by 'Variable'. You can override using the
## `.groups` argument.
## # A tibble: 3 × 8
## # Groups:   Variable [3]
##   Variable          Count_0 Count_1 Count_2 Count_3 Count_4  Count_5  Count_6
##   <chr>               <dbl>   <dbl>   <dbl>   <dbl>   <dbl>    <dbl>    <dbl>
## 1 BookingsCanceled     99.9  0.0736 0.00217  NA     NA      NA       NA      
## 2 BookingsCheckedIn    NA   98.4    1.37      0.117  0.0563  0.00866  0.00650
## 3 BookingsNoShowed    100.   0.0260 0.00433  NA     NA      NA       NA
# Distribution of Bookings Canceled
ggplot(hotel2, aes(x = factor(BookingsCanceled))) +
  geom_bar() +
  labs(title = "Distribution of Bookings Canceled", x = "Number of Cancellations", y = "Frequency") +
  scale_y_log10() + 
  theme_minimal()+
  theme(panel.grid = element_blank())

# Distribution of BookingsNoShowed
ggplot(hotel2, aes(x = factor(BookingsNoShowed))) +
  geom_bar() +
  labs(title = "Distribution of BookingsNoShowed", x = "Number of NoShowed", y = "Frequency") +
  scale_y_log10() + 
  theme_minimal()+
  theme(panel.grid = element_blank())

CheckedIn_Rows <- hotel2[hotel2$BookingsCheckedIn > 0, ]

# View the selected rows
#print(CheckedIn_Rows)
# Distribution of BookingsCheckedIn
library(ggplot2)
ggplot(hotel2, aes(x = factor(BookingsCheckedIn))) +
  geom_bar() +
  labs(title = "Distribution of BookingsCheckedIn", x = "Number of CheckedIn", y = "Frequency") +
  scale_y_log10() + 
  theme_minimal()+
  theme(panel.grid = element_blank())

hotel2 %>%
  pivot_longer(
    cols = c(SRHighFloor, SRLowFloor, SRAccessibleRoom, SRMediumFloor,
        SRBathtub, SRShower, SRCrib, SRKingSizeBed, SRTwinBed,
        SRNearElevator, SRAwayFromElevator, SRNoAlcoholInMiniBar, SRQuietRoom),
    names_to = "Variable",
    values_to = "Value"
  ) %>%
  group_by(Variable, Value) %>%
  summarise(
    Percentage = n() / nrow(hotel2) * 100
  ) %>%
  pivot_wider(
    names_from = Value,
    values_from = Percentage,
    names_prefix = "Count_"
  )
## `summarise()` has grouped output by 'Variable'. You can override using the
## `.groups` argument.
## # A tibble: 13 × 3
## # Groups:   Variable [13]
##    Variable             Count_0  Count_1
##    <chr>                  <dbl>    <dbl>
##  1 SRAccessibleRoom       100.   0.0325 
##  2 SRAwayFromElevator      99.6  0.353  
##  3 SRBathtub               99.8  0.240  
##  4 SRCrib                  99.1  0.899  
##  5 SRHighFloor             95.5  4.50   
##  6 SRKingSizeBed           64.8 35.2    
##  7 SRLowFloor              99.9  0.123  
##  8 SRMediumFloor           99.9  0.0801 
##  9 SRNearElevator         100.   0.0411 
## 10 SRNoAlcoholInMiniBar   100.   0.00433
## 11 SRQuietRoom             91.2  8.76   
## 12 SRShower                99.8  0.171  
## 13 SRTwinBed               87.4 12.6
library(ggplot2)

# Create a bar graph for DistributionChannel
ggplot(data = hotel2, aes(x = DistributionChannel)) +
  geom_bar() +
  labs(title = "Distribution of Distribution Channels", x = "Distribution Channel", y = "Frequency") + 
  theme_minimal()+
  theme(panel.grid = element_blank())

# Create a bar graph for MarketSegment
ggplot(data = hotel2, aes(x = MarketSegment)) +
  geom_bar() +
  labs(title = "Distribution of Market Segments", x = "Market Segment", y = "Frequency") +  
  theme_minimal()+
  theme(panel.grid = element_blank())

library(dplyr)

# Summarize total revenue by DistributionChannel and Nationality
revenue_by_channel_nationality <- hotel2 %>%
  group_by(DistributionChannel, Nationality) %>%
  summarise(TotalRevenue = sum(TotalRevenue))
## `summarise()` has grouped output by 'DistributionChannel'. You can override
## using the `.groups` argument.
# Arrange the data frame by TotalRevenue in descending order within each DistributionChannel
revenue_by_channel_nationality <- revenue_by_channel_nationality %>%
  arrange(DistributionChannel, desc(TotalRevenue))

# View the sorted data frame
#print(revenue_by_channel_nationality)
# Select the top 10 highest revenues for each DistributionChannel
top_10_revenues <- revenue_by_channel_nationality %>%
  group_by(DistributionChannel) %>%
  top_n(10, TotalRevenue)

# View the sorted data frame of the top 10 highest revenues
#print(top_10_revenues)
average_revenues <- top_10_revenues %>%
  group_by(DistributionChannel) %>%
  summarize(AverageRevenue = mean(TotalRevenue))

# Arrange the data frame by AverageRevenue in descending order
sorted_average_revenues <- average_revenues %>%
  arrange(desc(AverageRevenue))

# View the sorted data frame
print(sorted_average_revenues)
## # A tibble: 4 × 2
##   DistributionChannel     AverageRevenue
##   <chr>                            <dbl>
## 1 Travel Agent/Operator         1056473.
## 2 Direct                         171443.
## 3 Corporate                       35178.
## 4 Electronic Distribution          9937.
library(dplyr) 
# Select the top 10 highest revenues for each MarketSegment

# Summarize total revenue by DistributionChannel and Nationality
revenue_by_marketsegment_nationality <- hotel2 %>%
  group_by(MarketSegment, Nationality) %>%
  summarise(TotalRevenue = sum(TotalRevenue))
## `summarise()` has grouped output by 'MarketSegment'. You can override using the
## `.groups` argument.
# Arrange the data frame by TotalRevenue in descending order within each DistributionChannel
revenue_by_marketsegment_nationality <- revenue_by_marketsegment_nationality %>%
  arrange(MarketSegment, desc(TotalRevenue))

# View the sorted data frame
#print(revenue_by_channel_nationality)

# Select the top 10 highest revenues for each DistributionChannel
top_10_revenues <- revenue_by_marketsegment_nationality %>%
  group_by(MarketSegment) %>%
  top_n(10, TotalRevenue)

# View the sorted data frame of the top 10 highest revenues
#print(top_10_revenues)
top_10_revenues <- revenue_by_marketsegment_nationality %>%
  group_by(MarketSegment) %>%
  top_n(10, TotalRevenue)

# View the sorted data frame of the top 10 highest revenues
#print(top_10_revenues)
selected_variables <- c("TotalRevenue", "Age", "DaysSinceCreation", "AverageLeadTime", 
                         "LodgingRevenue", "OtherRevenue", "BookingsCanceled", 
                         "BookingsNoShowed", "BookingsCheckedIn", "PersonsNights", 
                         "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay", 
                         "RatePerNight")

# Calculate the correlation matrix
cor_matrix <- cor(hotel2[, selected_variables])

# Print the correlation matrix
print(cor_matrix)
##                    TotalRevenue          Age DaysSinceCreation AverageLeadTime
## TotalRevenue        1.000000000  0.026408375     -1.187381e-01      0.13818874
## Age                 0.026408375  1.000000000      3.787487e-02      0.13552778
## DaysSinceCreation  -0.118738090  0.037874865      1.000000e+00     -0.06271305
## AverageLeadTime     0.138188742  0.135527779     -6.271305e-02      1.00000000
## LodgingRevenue      0.978291270 -0.003719790     -1.507181e-01      0.11370375
## OtherRevenue        0.598853294  0.130029626      6.244148e-02      0.16578397
## BookingsCanceled   -0.007050532  0.008092166      7.669014e-05     -0.02087861
## BookingsNoShowed   -0.001933558  0.007954741      7.501055e-03     -0.01564573
## BookingsCheckedIn   0.052823769  0.021481253     -8.427305e-03     -0.05915103
## PersonsNights       0.649164866  0.027906931      3.919000e-02      0.24866457
## RoomNights          0.676025722  0.039587580     -4.705411e-03      0.20943061
## DaysSinceLastStay  -0.116304006  0.037479255      9.962052e-01     -0.05725979
## DaysSinceFirstStay -0.115886718  0.038029599      9.997640e-01     -0.06179726
## RatePerNight        0.464754525 -0.043449751     -1.453925e-01     -0.09161002
##                    LodgingRevenue OtherRevenue BookingsCanceled
## TotalRevenue          0.978291270  0.598853294    -7.050532e-03
## Age                  -0.003719790  0.130029626     8.092166e-03
## DaysSinceCreation    -0.150718099  0.062441477     7.669014e-05
## AverageLeadTime       0.113703750  0.165783967    -2.087861e-02
## LodgingRevenue        1.000000000  0.419887287    -7.046156e-03
## OtherRevenue          0.419887287  1.000000000    -3.647651e-03
## BookingsCanceled     -0.007046156 -0.003647651     1.000000e+00
## BookingsNoShowed     -0.001474648 -0.002769165     7.213181e-02
## BookingsCheckedIn     0.053714281  0.023760733     1.417454e-01
## PersonsNights         0.597306785  0.534699534    -1.359460e-02
## RoomNights            0.646485843  0.462283043     1.329818e-03
## DaysSinceLastStay    -0.148416131  0.064205495    -9.476939e-03
## DaysSinceFirstStay   -0.148015026  0.064482924     2.281001e-03
## RatePerNight          0.514362475  0.047619869    -8.138870e-03
##                    BookingsNoShowed BookingsCheckedIn PersonsNights
## TotalRevenue          -1.933558e-03       0.052823769   0.649164866
## Age                    7.954741e-03       0.021481253   0.027906931
## DaysSinceCreation      7.501055e-03      -0.008427305   0.039189995
## AverageLeadTime       -1.564573e-02      -0.059151031   0.248664566
## LodgingRevenue        -1.474648e-03       0.053714281   0.597306785
## OtherRevenue          -2.769165e-03       0.023760733   0.534699534
## BookingsCanceled       7.213181e-02       0.141745404  -0.013594602
## BookingsNoShowed       1.000000e+00       0.088247506  -0.012436750
## BookingsCheckedIn      8.824751e-02       1.000000000   0.004986333
## PersonsNights         -1.243675e-02       0.004986333   1.000000000
## RoomNights             9.239105e-05       0.079331682   0.821625241
## DaysSinceLastStay      1.113204e-03      -0.058703401   0.043688517
## DaysSinceFirstStay     7.444456e-03      -0.007748945   0.042722410
## RatePerNight          -2.665032e-03      -0.010138284  -0.104983653
##                       RoomNights DaysSinceLastStay DaysSinceFirstStay
## TotalRevenue        6.760257e-01      -0.116304006      -0.1158867175
## Age                 3.958758e-02       0.037479255       0.0380295993
## DaysSinceCreation  -4.705411e-03       0.996205219       0.9997640330
## AverageLeadTime     2.094306e-01      -0.057259790      -0.0617972571
## LodgingRevenue      6.464858e-01      -0.148416131      -0.1480150261
## OtherRevenue        4.622830e-01       0.064205495       0.0644829244
## BookingsCanceled    1.329818e-03      -0.009476939       0.0022810014
## BookingsNoShowed    9.239105e-05       0.001113204       0.0074444561
## BookingsCheckedIn   7.933168e-02      -0.058703401      -0.0077489453
## PersonsNights       8.216252e-01       0.043688517       0.0427224103
## RoomNights          1.000000e+00      -0.003814850      -0.0004645289
## DaysSinceLastStay  -3.814850e-03       1.000000000       0.9961856675
## DaysSinceFirstStay -4.645289e-04       0.996185668       1.0000000000
## RatePerNight       -2.105950e-01      -0.144004837      -0.1463024751
##                    RatePerNight
## TotalRevenue        0.464754525
## Age                -0.043449751
## DaysSinceCreation  -0.145392461
## AverageLeadTime    -0.091610016
## LodgingRevenue      0.514362475
## OtherRevenue        0.047619869
## BookingsCanceled   -0.008138870
## BookingsNoShowed   -0.002665032
## BookingsCheckedIn  -0.010138284
## PersonsNights      -0.104983653
## RoomNights         -0.210594995
## DaysSinceLastStay  -0.144004837
## DaysSinceFirstStay -0.146302475
## RatePerNight        1.000000000
library(corrplot)
## corrplot 0.92 loaded
# Visualize the correlation matrix with a heatmap
corrplot(cor_matrix, method = "color", col = colorRampPalette(c("red", "white", "blue"))(100), tl.col = "black")

Remove RatePerNight = $0

#hotel3 <- hotel3[hotel3$RatePerNight != 0.00, ]
str(hotel2)
## tibble [46,179 × 33] (S3: tbl_df/tbl/data.frame)
##  $ ...1                : num [1:46179] 1 2 3 4 5 6 7 8 9 10 ...
##  $ ID                  : num [1:46179] 32375 74084 37550 34105 19601 ...
##  $ Nationality         : chr [1:46179] "GBR" "DEU" "ESP" "ESP" ...
##  $ Age                 : num [1:46179] 25 39 45 43 50 43 29 41 40 54 ...
##  $ DaysSinceCreation   : num [1:46179] 536 94 459 509 754 238 625 598 92 941 ...
##  $ AverageLeadTime     : num [1:46179] 48 36 20 129 50 69 64 2 136 2 ...
##  $ LodgingRevenue      : num [1:46179] 213 157 124 560 238 ...
##  $ OtherRevenue        : num [1:46179] 41.5 50 11 68 60 56 46 84.3 14 7 ...
##  $ BookingsCanceled    : num [1:46179] 0 0 0 0 0 0 0 0 0 0 ...
##  $ BookingsNoShowed    : num [1:46179] 0 0 0 0 0 0 0 0 0 0 ...
##  $ BookingsCheckedIn   : num [1:46179] 1 1 1 1 1 1 1 1 1 1 ...
##  $ PersonsNights       : num [1:46179] 6 4 1 12 4 8 4 3 2 1 ...
##  $ RoomNights          : num [1:46179] 3 2 1 4 4 4 2 3 2 1 ...
##  $ DaysSinceLastStay   : num [1:46179] 539 96 460 513 758 242 627 601 94 942 ...
##  $ DaysSinceFirstStay  : num [1:46179] 539 96 460 513 758 242 627 601 94 942 ...
##  $ DistributionChannel : chr [1:46179] "Travel Agent/Operator" "Travel Agent/Operator" "Electronic Distribution" "Direct" ...
##  $ MarketSegment       : chr [1:46179] "Travel Agent/Operator" "Other" "Other" "Direct" ...
##  $ SRHighFloor         : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ SRLowFloor          : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ SRAccessibleRoom    : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ SRMediumFloor       : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ SRBathtub           : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ SRShower            : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ SRCrib              : Factor w/ 2 levels "0","1": 1 1 1 2 1 1 1 1 1 1 ...
##  $ SRKingSizeBed       : Factor w/ 2 levels "0","1": 1 2 1 2 1 1 2 2 2 1 ...
##  $ SRTwinBed           : Factor w/ 2 levels "0","1": 1 1 1 1 1 2 1 1 1 1 ...
##  $ SRNearElevator      : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ SRAwayFromElevator  : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ SRNoAlcoholInMiniBar: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ SRQuietRoom         : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 2 2 1 1 ...
##  $ TotalRevenue        : num [1:46179] 255 207 135 628 298 ...
##  $ RatePerNight        : num [1:46179] 71.1 78.4 124 140 59.5 ...
##  $ AgeGroups           : Factor w/ 4 levels "Under 30","31-45",..: 1 2 2 2 3 2 1 2 2 3 ...
##  - attr(*, "na.action")= 'omit' Named int [1:3598] 77 89 100 114 133 180 186 242 273 283 ...
##   ..- attr(*, "names")= chr [1:3598] "77" "89" "100" "114" ...
#hotel3 <- hotel2[hotel2$TotalRevenue > 0, ]
hist(log(hotel2$TotalRevenue), main = "Distribution of Log(TotalRevenue)", xlab = "Log(TotalRevenue)")

Data Partition

set.seed(1)

train.rows <- sample(rownames(hotel2), dim(hotel2)[1]*0.6)

valid.rows <- sample(setdiff(rownames(hotel2), train.rows), 
                     dim(hotel2)[1]*0.4)
train.hotel3 <- hotel2[train.rows, ]
valid.hotel3 <- hotel2[valid.rows, ]

Linear Regression Model

selected_variables <- c("TotalRevenue", "Age", "DaysSinceCreation", "AverageLeadTime", "LodgingRevenue", "OtherRevenue", "BookingsCanceled", "BookingsCheckedIn", "PersonsNights", "RoomNights", "DaysSinceLastStay", "DaysSinceFirstStay", "RatePerNight")

cor_matrix <- cor(train.hotel3[, selected_variables])

# Print the correlation matrix
print(cor_matrix)
##                    TotalRevenue          Age DaysSinceCreation AverageLeadTime
## TotalRevenue        1.000000000  0.026833562     -0.1148767344      0.14309133
## Age                 0.026833562  1.000000000      0.0340138919      0.13511647
## DaysSinceCreation  -0.114876734  0.034013892      1.0000000000     -0.06567201
## AverageLeadTime     0.143091325  0.135116475     -0.0656720098      1.00000000
## LodgingRevenue      0.978322644 -0.005767266     -0.1469743289      0.11705198
## OtherRevenue        0.597479601  0.140017648      0.0652950957      0.17431318
## BookingsCanceled   -0.005825823  0.010195753     -0.0041250812     -0.02382803
## BookingsCheckedIn   0.054863829  0.023755137     -0.0115896062     -0.05678203
## PersonsNights       0.648995666  0.027924973      0.0413056216      0.25283014
## RoomNights          0.675788907  0.041217075      0.0008021354      0.21487713
## DaysSinceLastStay  -0.112350498  0.033663371      0.9961801037     -0.06014047
## DaysSinceFirstStay -0.111968627  0.034173482      0.9996119603     -0.06474036
## RatePerNight        0.463421422 -0.046917607     -0.1471352929     -0.09188015
##                    LodgingRevenue OtherRevenue BookingsCanceled
## TotalRevenue          0.978322644  0.597479601    -0.0058258228
## Age                  -0.005767266  0.140017648     0.0101957533
## DaysSinceCreation    -0.146974329  0.065295096    -0.0041250812
## AverageLeadTime       0.117051979  0.174313184    -0.0238280261
## LodgingRevenue        1.000000000  0.418468477    -0.0061053912
## OtherRevenue          0.418468477  1.000000000    -0.0019092437
## BookingsCanceled     -0.006105391 -0.001909244     1.0000000000
## BookingsCheckedIn     0.055559947  0.025479255     0.1393421178
## PersonsNights         0.597591303  0.532334264    -0.0150990852
## RoomNights            0.646225817  0.461519481    -0.0027112515
## DaysSinceLastStay    -0.144586314  0.067127644    -0.0142132819
## DaysSinceFirstStay   -0.144228923  0.067418541    -0.0006488449
## RatePerNight          0.513317823  0.044775720    -0.0045020041
##                    BookingsCheckedIn PersonsNights    RoomNights
## TotalRevenue             0.054863829   0.648995666  0.6757889070
## Age                      0.023755137   0.027924973  0.0412170753
## DaysSinceCreation       -0.011589606   0.041305622  0.0008021354
## AverageLeadTime         -0.056782034   0.252830136  0.2148771301
## LodgingRevenue           0.055559947   0.597591303  0.6462258167
## OtherRevenue             0.025479255   0.532334264  0.4615194811
## BookingsCanceled         0.139342118  -0.015099085 -0.0027112515
## BookingsCheckedIn        1.000000000   0.007429534  0.0805870549
## PersonsNights            0.007429534   1.000000000  0.8216919395
## RoomNights               0.080587055   0.821691940  1.0000000000
## DaysSinceLastStay       -0.061875476   0.045676763  0.0019881737
## DaysSinceFirstStay      -0.010220747   0.044904483  0.0051263462
## RatePerNight            -0.008331812  -0.106595762 -0.2123932611
##                    DaysSinceLastStay DaysSinceFirstStay RatePerNight
## TotalRevenue            -0.112350498      -0.1119686269  0.463421422
## Age                      0.033663371       0.0341734821 -0.046917607
## DaysSinceCreation        0.996180104       0.9996119603 -0.147135293
## AverageLeadTime         -0.060140475      -0.0647403554 -0.091880147
## LodgingRevenue          -0.144586314      -0.1442289227  0.513317823
## OtherRevenue             0.067127644       0.0674185407  0.044775720
## BookingsCanceled        -0.014213282      -0.0006488449 -0.004502004
## BookingsCheckedIn       -0.061875476      -0.0102207466 -0.008331812
## PersonsNights            0.045676763       0.0449044831 -0.106595762
## RoomNights               0.001988174       0.0051263462 -0.212393261
## DaysSinceLastStay        1.000000000       0.9961272169 -0.145819413
## DaysSinceFirstStay       0.996127217       1.0000000000 -0.148066255
## RatePerNight            -0.145819413      -0.1480662553  1.000000000
# model_1 <- aov(TotalRevenue ~ DistributionChannel, data = hotel2)

# Perform Tukey's HSD post hoc analysis
# tukey_results_1 <- TukeyHSD(model_1)

# Print the results
# print(tukey_results_1)
model_2 <- aov(TotalRevenue ~ MarketSegment, data = hotel2)

# Perform Tukey's HSD post hoc analysis
tukey_results_2 <- TukeyHSD(model_2)

# Print the results
print(tukey_results_2)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = TotalRevenue ~ MarketSegment, data = hotel2)
## 
## $MarketSegment
##                                           diff         lwr        upr     p adj
## Complementary-Aviation              -19.886071 -140.334512 100.562369 0.9990241
## Corporate-Aviation                  -74.478842 -123.443458 -25.514226 0.0001483
## Direct-Aviation                      26.203216  -20.908204  73.314636 0.6562968
## Groups-Aviation                     -11.359875  -58.512022  35.792272 0.9920329
## Other-Aviation                       49.367326    2.745608  95.989043 0.0297514
## Travel Agent/Operator-Aviation      -27.779502  -74.858662  19.299658 0.5891471
## Corporate-Complementary             -54.592771 -166.770666  57.585124 0.7829501
## Direct-Complementary                 46.089287  -65.292185 157.470760 0.8866594
## Groups-Complementary                  8.526196 -102.872509 119.924901 0.9999891
## Other-Complementary                  69.253397  -41.921830 180.428624 0.5230854
## Travel Agent/Operator-Complementary  -7.893431 -119.261262 103.474401 0.9999931
## Direct-Corporate                    100.682058   83.490806 117.873310 0.0000000
## Groups-Corporate                     63.118967   45.816417  80.421518 0.0000000
## Other-Corporate                     123.846168  108.046238 139.646098 0.0000000
## Travel Agent/Operator-Corporate      46.699340   29.596692  63.801988 0.0000000
## Groups-Direct                       -37.563091  -48.578103 -26.548079 0.0000000
## Other-Direct                         23.164110   14.703020  31.625200 0.0000000
## Travel Agent/Operator-Direct        -53.982718  -64.680981 -43.284455 0.0000000
## Other-Groups                         60.727201   52.042205  69.412196 0.0000000
## Travel Agent/Operator-Groups        -16.419627  -27.295836  -5.543418 0.0001732
## Travel Agent/Operator-Other         -77.146828  -85.426410 -68.867246 0.0000000
library(dplyr)

hotel2 <- hotel2 %>%
  mutate(MarketSegmentCombined = ifelse(MarketSegment %in% c("Other", "Complementary"), "Other_Complementary", as.character(MarketSegment)))
library(ggplot2)

# Create a bar graph for DistributionChannel
ggplot(data = hotel2, aes(x = DistributionChannel)) +
  geom_bar() +
  labs(title = "Distribution of Distribution Channels", x = "Distribution Channel", y = "Frequency") + 
  theme_minimal() +
  theme(panel.grid = element_blank())

# Create a bar graph for CombinedSegment
ggplot(data = hotel2, aes(x = MarketSegmentCombined)) +
  geom_bar() +
  labs(title = "Distribution of Combined Segments", x = "Combined Segment", y = "Frequency") +  
  theme_minimal() +
  theme(panel.grid = element_blank())

# linear regression model 
# Model 1: Include Customer Preferences - Characteristics of Room + Characteristic Customers ( Customer Types and Age Groups)
#reg1 <- lm(TotalRevenue ~  Age  + AverageLeadTime + OtherRevenue + BookingsCanceled + BookingsCheckedIn + RoomNights + DaysSinceLastStay + SRLowFloor + SRMediumFloor + SRHighFloor + SRAccessibleRoom + SRBathtub + SRShower + SRCrib + SRKingSizeBed + SRTwinBed + SRNearElevator + SRAwayFromElevator + SRNoAlcoholInMiniBar + SRQuietRoom + RatePerNight + DistributionChannel + train.hotel3$MarketSegmentCombined, data = train.hotel3)
#summary (reg1)
#if (!requireNamespace("car", quietly = TRUE)) {
#  install.packages("car")
#}
#library(car)

# Calculate VIF values
#vif_values <- vif(reg1)

# Print the VIF values
#print(vif_values)
#pred_t <- predict(reg1, na.action=na.pass)
#pred_v <- predict(reg1, newdata= valid.hotel3,
#                  na.action=na.pass)
#summary_reg1 <- summary(reg1)

# Extract variable names with significance codes
#significant_variables <- rownames(summary_reg1$coefficients[summary_reg1$coefficients[, "Pr(>|t|)"] < 0.05, ])

# Filter coefficients data frame
#df_significant_coefficients <- df_coefficients[df_coefficients$variable %in% significant_variables, ]

# Create a bar chart for significant coefficients
#bar_chart_significant <- ggplot(df_significant_coefficients, aes(x = variable, y = coefficient)) +
#  geom_bar(stat = "identity", fill = "darkblue", position = "stack") +
#  geom_text(aes(label = round(coefficient, 2)), vjust = -0.5, size = 3, color = "black") +
#  labs(x = "Significant Variables", y = "Coefficient", title = "Linear Regression Coefficients with Significance") +
#  theme_minimal() +
#  theme(panel.grid.major.x = element_blank(), 
#        panel.grid.minor.x = element_blank(), 
#        panel.background = element_rect(fill = "white"),
#        axis.text.x = element_text(angle = 45, hjust = 1))

# Display the bar chart for significant coefficients
#print(bar_chart_significant)

Predictive Performance

Predictions for a sample of validation data

library(forecast)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(ggplot2) 
library(gridExtra) 
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
library(gains) 
## Evaluate performance training
#accuracy(pred_t, train.hotel3$TotalRevenue)

Compute accuracy on prediction set

## Evaluate performance validation
#accuracy(pred_v, valid.hotel3$TotalRevenue)
#hist(pred_t)
#hist(pred_v)
#boxplot(pred_t)
#boxplot(pred_v)
##Plotting residual histograms for training and validation data
#resid.t<-residuals(reg1)
#hist(resid.t)
#resid.v<- valid.hotel3$TotalRevenue-pred_v
#hist(resid.v)
#Plotting boxplots for both training and validation errors
#boxplot(resid.t,resid.v)
# Create a data frame with actual, predicted, and residuals for the trainning data
#tr.res <- data.frame(Actual = train.hotel3$TotalRevenue,
#                     Predicted = reg1$fitted.values,
#                     Residuals = reg1$residuals)

#head(tr.res)
# Create a data frame with actual, predicted, and residuals for the validation data
#vl.res <- data.frame(valid.hotel3$TotalRevenue, pred_v, residuals = 
#                       valid.hotel3$TotalRevenue - pred_v)
#head(vl.res)

Cumulative Gains and Lift Charts

install.packages("forecast")
## Warning in download.file(url, destfile, method, mode = "wb", ...): downloaded
## length 0 != reported length 0
## Warning in download.file(url, destfile, method, mode = "wb", ...): URL
## 'https://cran.rstudio.com/bin/macosx/big-sur-x86_64/contrib/4.3/forecast_8.21.1.tgz':
## Timeout of 60 seconds was reached
## Error in download.file(url, destfile, method, mode = "wb", ...) : 
##   download from 'https://cran.rstudio.com/bin/macosx/big-sur-x86_64/contrib/4.3/forecast_8.21.1.tgz' failed
## Warning in download.packages(pkgs, destdir = tmpd, available = available, :
## download of package 'forecast' failed
library(forecast)
library(gains)
#gain <- gains(valid.hotel3$TotalRevenue[!is.na(pred_v)], pred_v[!is.na(pred_v)])
#gain
#library(gains)

# cumulative lift chart
#options(scipen=999) 

#Hotel_TotalRevenue <- valid.hotel3$TotalRevenue [!is.na(valid.hotel3$TotalRevenue)]

# Plot cumulative lift chart
#plot(c(0, gain$cume.pct.of.total * sum(valid.hotel3$TotalRevenue[!is.na(valid.hotel3$TotalRevenue)])) ~ c(0, gain$cume.obs), 
#     xlab = "# cases", ylab = "Cumulative TotalRevenue", main = "Lift Chart", type = "l")

# Baseline
#lines(c(0, sum(valid.hotel3$TotalRevenue)) ~ c(0, dim(valid.hotel3)[1]), col = "red", lty = 2)
#library(ggplot2)

# Create a data frame for the Decile-wise lift chart
#df_decile <- data.frame(
#  percentile = gain$depth,
#  meanResponse = gain$mean.resp / mean(valid.hotel3$TotalRevenue)
#)

# Create the Decile-wise lift chart using ggplot2
#decile_lift_chart <- ggplot(df_decile, aes(x = percentile, y = meanResponse)) +
#  geom_bar(stat = "identity", fill = "blue") +  # Set bar color to blue
#  geom_text(aes(label = round(meanResponse, 2)), vjust = -0.5, size = 3) +  
#  labs(x = "Percentile", y = "Decile mean / global mean", title = "Decile-wise Lift Chart") +
#  scale_x_continuous(breaks = seq(0, 100, by = 10)) +
#  theme_minimal() +  # Remove other unnecessary elements
#  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())  # Remove grid lines

# Display the Decile-wise lift chart
#print(decile_lift_chart)
# Baseline curve for random 1,975 customers:
#sum(valid.hotel3$TotalRevenue)/10
#valid.hotel3_sorteddata <- valid.hotel3[order(valid.hotel3$TotalRevenue, decreasing = TRUE), ]

# Select the top 2,317 customers
#top_customers <- head(valid.hotel3_sorteddata, 1870)

# Calculate the cumulative actual total revenue for the top 1870 customers
#cumulative_actual_total_revenue <- sum(top_customers$TotalRevenue)
#cumulative_actual_total_revenue
#length(hotel2$DistributionChannel)
#length(hotel2$MarketSegment)
library(ggplot2)
ggplot(train.hotel3, aes(RatePerNight, TotalRevenue, color = DistributionChannel, shape = DistributionChannel)) +
    geom_point(alpha = 1.5) +
    xlab("RatePerNight") +
    ylab("TotalRevenue")

library(dplyr)
library(ggplot2)

# Box plot
ggplot(train.hotel3, aes(x = DistributionChannel, y = RatePerNight, fill = DistributionChannel)) +
  geom_boxplot() +
  ylab("RatePerNight") +
  ggtitle("RatePerNight Distribution in Different Distribution Channels") +
  theme_minimal()

library(ggplot2)

ggplot(train.hotel3, aes(x = DistributionChannel, y = TotalRevenue, fill = DistributionChannel)) +
  geom_bar(stat = "identity") +
  xlab("Distribution Channel") +
  ylab("Total Revenue") +
  labs(title = "Total Revenue by Distribution Channel") +
  theme_minimal()

contingency_table <- table(hotel2$MarketSegmentCombined, hotel2$DistributionChannel)

# Print the contingency table
print(contingency_table)
##                        
##                         Corporate Direct Electronic Distribution
##   Aviation                    156      0                       0
##   Corporate                  1131     31                       1
##   Direct                        7   5801                       2
##   Groups                      317     81                       1
##   Other_Complementary          25     57                     430
##   Travel Agent/Operator        82     12                       4
##                        
##                         Travel Agent/Operator
##   Aviation                                  4
##   Corporate                               297
##   Direct                                   75
##   Groups                                 5125
##   Other_Complementary                   26432
##   Travel Agent/Operator                  6108
library(ggplot2)

# Your data
data <- data.frame(
  Segment = c("Aviation", "Corporate", "Direct", "Groups", "Other_Complementary", "Travel Agent/Operator"),
  Corporate = c(156, 1133, 7, 318, 25, 82),
  Direct = c(0, 31, 5915, 82, 58, 12),
  Electronic_Distribution = c(0, 1, 2, 1, 430, 4),
  Travel_Agent_Operator = c(4, 298, 75, 5153, 26813, 6169)
)

# Reshape data for ggplot2
data_long <- tidyr::gather(data, key = "Distribution_Channel", value = "Count", -Segment)

# Create a bar chart with larger font size
ggplot(data_long, aes(x = Segment, y = log(Count + 1), fill = Distribution_Channel)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.8)) +
  labs(title = "Distribution of Segments by Distribution Channel (Log Scale)", x = "Segment", y = "Log(Count + 1)") +
  theme_minimal() +
  theme(text = element_text(size = )) 

#library(tibble)

#numberofclusters <- 10
#sserror <- numeric(numberofclusters)

#set.seed(123)

#for (i in 1:numberofclusters) {
#  kmeans_out <- kmeans(train.hotel3_columns, centers = i, nstart = 20)
#  sserror[i] <- kmeans_out$tot.withinss
#}

#sserror_df <- tibble(clusters = 1:numberofclusters, wss = sserror)
 
#scree_plot <- ggplot(sserror_df, aes(x = clusters, y = wss, group = 1)) +
#  geom_point(size = 4) +
#  geom_line() +
#  scale_x_continuous(breaks = c(2, 4, 6, 8, 10)) +
#  xlab('Number of clusters') +
#  ylab('Total Within Sum of Squares Error')  
#scree_plot

Normalization

#train.hotel3[, c("RatePerNight", "AverageLeadTime")] = scale(train.hotel3[, c("RatePerNight", "AverageLeadTime")])

Fitting and evaluating the model

train.hotel3_columns <- train.hotel3[, c("AverageLeadTime", "PersonsNights", "RoomNights", "RatePerNight", "OtherRevenue", "TotalRevenue")]
set.seed(123)
kmeans_out <- kmeans(train.hotel3_columns, centers = 3, nstart = 20)
kmeans_out
## K-means clustering with 3 clusters of sizes 3975, 12141, 11591
## 
## Cluster means:
##   AverageLeadTime PersonsNights RoomNights RatePerNight OtherRevenue
## 1        76.54164      8.110692   3.916981     187.9975    101.61276
## 2        57.74327      3.223787   1.827938     101.9453     30.49785
## 3        83.58580      6.472522   3.309896     117.8939     73.33603
##   TotalRevenue
## 1     741.1210
## 2     200.1372
## 3     429.3238
## 
## Clustering vector:
##     [1] 2 3 3 3 2 1 1 3 3 2 1 3 2 2 2 3 2 2 2 3 3 1 3 2 2 2 3 3 3 1 3 3 2 3 2 1
##    [37] 2 3 2 3 3 3 3 2 2 3 2 2 3 3 2 2 3 2 2 2 3 3 2 3 2 3 3 2 2 3 3 1 3 3 1 2
##    [73] 3 2 3 2 2 2 3 3 2 3 3 3 3 3 1 2 2 2 3 3 3 2 3 3 2 3 1 3 1 3 1 1 3 3 2 2
##   [109] 2 3 1 3 2 2 3 2 2 2 2 2 1 3 2 2 1 2 2 3 3 2 1 2 3 2 2 3 2 3 2 3 2 3 3 1
##   [145] 3 3 3 1 3 3 3 1 3 1 3 1 3 3 3 2 1 3 3 3 2 2 3 2 2 3 2 3 2 3 3 2 3 3 2 2
##   [181] 1 2 3 2 3 3 2 2 2 3 3 2 2 3 3 2 3 2 3 2 3 3 3 1 3 2 1 2 2 3 2 2 2 3 2 2
##   [217] 2 2 2 2 2 1 2 1 2 3 3 2 3 3 2 3 3 3 3 2 2 3 2 2 2 1 2 2 3 2 2 2 2 3 2 3
##   [253] 1 3 3 2 2 2 2 1 1 3 2 3 1 2 1 2 3 2 2 2 2 2 3 3 3 2 3 3 1 2 2 1 3 2 1 3
##   [289] 2 3 3 3 3 3 2 2 2 2 2 3 2 1 2 1 2 3 2 3 1 1 3 2 3 3 2 2 1 1 2 1 2 2 3 2
##   [325] 2 2 3 3 3 1 3 3 3 2 1 3 2 2 2 3 2 2 1 2 1 2 3 3 2 2 2 2 2 3 3 3 2 3 1 3
##   [361] 2 3 2 1 3 2 2 2 2 2 2 1 1 2 3 2 3 3 3 3 2 2 2 3 3 1 3 3 2 2 2 2 3 3 2 1
##   [397] 2 2 3 2 2 3 3 1 2 3 3 2 3 2 1 2 3 2 2 2 2 3 2 2 3 1 3 3 1 2 3 2 2 3 2 2
##   [433] 2 2 3 2 3 2 2 3 2 2 2 3 1 2 2 3 3 3 1 2 3 2 2 2 2 1 2 2 2 2 3 1 3 3 2 2
##   [469] 2 3 1 1 2 2 3 3 3 3 3 2 3 1 3 2 2 3 2 3 3 2 3 3 2 2 3 3 3 2 3 2 3 2 3 3
##   [505] 2 2 2 2 3 2 2 3 2 2 3 2 1 3 3 3 2 2 3 2 2 2 3 2 2 1 2 2 2 2 3 2 3 1 3 1
##   [541] 2 3 2 2 2 1 2 2 3 1 2 2 2 1 3 2 3 2 2 2 2 2 2 3 2 2 2 2 3 3 2 1 1 1 2 1
##   [577] 2 2 2 1 3 2 3 1 3 3 3 3 3 2 3 2 3 3 2 2 2 2 1 2 2 2 3 3 3 1 2 3 3 2 3 2
##   [613] 2 3 2 1 3 2 1 2 2 3 2 1 2 3 2 3 3 2 3 3 2 2 2 2 2 2 2 3 3 1 1 3 3 2 3 2
##   [649] 2 2 2 2 3 2 2 2 2 2 3 2 2 2 3 2 2 2 2 1 1 2 3 3 2 1 3 2 3 2 2 2 3 1 2 2
##   [685] 1 1 2 3 2 3 3 3 3 2 3 3 3 3 1 2 3 3 2 2 2 2 3 2 3 3 2 3 2 3 2 1 2 3 2 3
##   [721] 2 3 3 2 1 1 2 3 1 2 1 3 2 2 3 2 3 2 3 2 2 3 3 2 1 3 2 3 2 3 3 3 3 2 3 3
##   [757] 3 3 1 3 2 1 2 3 2 3 2 2 3 3 2 2 3 1 3 2 3 2 2 2 3 2 3 2 2 1 1 3 1 2 3 2
##   [793] 3 2 3 3 3 2 3 3 3 3 3 2 2 2 3 2 2 3 2 3 2 1 2 3 2 1 2 2 1 3 2 2 2 1 3 2
##   [829] 1 2 1 3 3 2 3 3 1 3 3 1 3 3 2 3 3 3 3 2 2 3 3 2 3 2 2 2 1 1 2 2 2 2 3 2
##   [865] 3 1 1 3 2 2 2 2 1 3 2 2 2 1 3 2 2 2 1 2 3 2 2 1 1 2 2 2 3 1 3 2 2 3 3 2
##   [901] 2 3 2 3 3 3 3 1 3 1 1 2 2 3 1 1 2 3 2 3 3 3 3 2 2 3 2 2 2 3 2 1 3 3 2 3
##   [937] 2 3 3 1 2 3 3 1 3 2 2 3 2 2 3 2 3 2 3 1 3 2 2 1 3 3 2 3 3 2 2 3 3 2 2 2
##   [973] 3 1 2 2 2 2 1 2 3 2 2 3 1 2 1 3 3 3 3 2 3 1 2 2 3 2 3 2 1 2 1 3 1 1 3 1
##  [1009] 3 3 1 2 3 3 3 3 3 3 3 2 1 2 1 2 1 2 3 2 1 2 3 3 2 3 2 3 2 3 3 1 3 2 2 1
##  [1045] 2 3 2 3 3 3 2 2 2 3 3 2 3 2 3 2 3 1 2 2 1 2 2 3 3 2 1 2 3 3 1 1 3 2 3 3
##  [1081] 2 2 1 2 2 3 2 3 3 3 1 2 2 3 2 3 2 2 2 2 3 2 3 2 2 1 2 2 3 3 1 1 2 2 3 3
##  [1117] 3 1 3 2 2 3 3 3 2 2 3 3 2 2 2 3 3 2 2 2 2 2 2 2 3 2 2 3 3 2 2 2 3 3 3 1
##  [1153] 2 3 3 3 2 2 2 2 1 2 3 3 2 2 2 2 3 3 3 1 3 2 2 3 3 2 1 2 2 3 2 3 1 1 2 2
##  [1189] 3 2 2 1 2 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 3 3 1 3 3 3 2 1 3 3 3 3 3 2 2 3
##  [1225] 2 1 1 2 3 3 2 2 1 3 3 1 3 2 3 3 2 2 1 3 2 3 1 3 1 2 2 2 2 3 3 3 2 1 3 3
##  [1261] 2 2 3 2 2 2 2 2 2 3 2 1 3 3 2 2 3 2 1 3 1 3 3 1 3 1 2 1 3 3 1 2 3 1 2 2
##  [1297] 3 2 3 3 1 2 3 1 3 1 3 3 2 2 1 1 1 3 2 3 3 1 1 2 3 2 3 2 2 2 2 2 2 2 2 2
##  [1333] 3 2 2 1 2 1 2 2 1 3 3 2 2 2 2 2 3 2 2 2 1 2 2 3 3 3 2 3 2 2 2 3 3 2 3 1
##  [1369] 3 3 3 2 3 1 2 2 2 2 3 2 1 1 2 3 2 2 2 2 2 2 2 1 2 2 3 2 3 1 1 3 2 3 1 3
##  [1405] 1 2 3 3 3 2 1 2 1 3 1 3 3 1 2 3 3 2 2 2 1 2 2 2 2 1 2 2 3 3 1 3 2 2 2 2
##  [1441] 3 2 3 1 2 3 1 2 2 3 3 2 3 2 3 2 2 1 2 2 3 3 2 3 3 2 3 2 2 2 3 3 1 3 2 2
##  [1477] 2 3 2 2 2 3 1 1 3 2 2 3 3 3 3 3 2 2 3 2 2 2 2 2 3 1 3 2 2 2 1 2 2 3 1 2
##  [1513] 3 1 3 3 3 3 3 3 2 2 3 2 2 2 1 3 3 2 1 2 3 3 2 3 3 1 2 1 2 2 3 2 1 3 2 3
##  [1549] 3 3 3 3 2 3 3 3 2 2 2 3 2 3 3 2 1 3 3 3 3 1 2 3 3 3 2 3 3 3 2 3 2 1 3 3
##  [1585] 3 2 3 2 3 3 2 2 2 2 3 2 2 3 2 2 2 2 2 2 3 3 2 3 3 3 2 1 2 3 2 3 3 3 3 3
##  [1621] 1 2 2 3 1 3 2 2 3 2 3 2 2 3 1 3 2 2 3 2 2 2 2 2 3 2 2 1 3 2 3 2 3 3 3 3
##  [1657] 3 3 3 2 2 2 3 3 2 1 3 2 1 3 2 2 1 3 3 3 3 2 2 2 3 2 2 3 2 2 2 3 2 3 2 2
##  [1693] 3 2 3 2 2 2 3 3 3 3 2 1 2 3 3 1 1 3 2 2 3 2 3 2 1 3 1 3 2 3 3 3 3 3 2 2
##  [1729] 2 3 1 2 1 3 2 1 1 2 3 3 3 3 2 2 2 2 2 3 1 2 2 2 3 2 2 3 2 3 2 2 2 2 3 3
##  [1765] 2 3 3 3 3 1 3 3 2 1 3 2 3 2 3 3 1 3 3 3 3 2 3 2 2 2 2 3 2 1 2 2 2 2 2 3
##  [1801] 2 3 3 3 3 3 3 2 3 3 3 3 2 2 1 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 2 2 1 3 3 3
##  [1837] 3 2 3 3 2 3 3 3 2 3 2 2 3 3 2 3 1 1 2 3 1 1 2 1 3 1 2 3 2 1 2 1 3 3 3 2
##  [1873] 3 3 3 3 3 1 3 3 1 3 3 1 3 3 2 2 3 3 3 2 2 1 2 3 2 1 2 3 2 3 2 3 2 1 3 2
##  [1909] 3 2 1 3 2 3 2 1 1 3 2 3 2 2 2 2 3 2 3 3 3 2 3 2 2 2 2 3 1 1 2 2 3 2 3 1
##  [1945] 3 2 3 2 2 3 2 2 2 3 3 1 3 3 3 1 3 3 1 2 2 1 2 2 3 2 3 3 2 2 1 3 3 1 3 2
##  [1981] 3 2 3 3 3 2 3 3 1 2 3 2 3 3 3 2 3 2 2 2 2 3 1 3 2 2 2 2 3 2 3 3 3 3 3 3
##  [2017] 2 2 2 3 2 3 1 2 1 2 3 2 1 2 3 3 2 2 2 3 1 3 2 1 1 3 3 2 2 1 3 2 1 3 1 3
##  [2053] 2 2 3 3 2 2 2 3 2 2 3 1 3 1 3 3 3 3 2 3 2 2 2 2 2 2 2 2 3 2 2 2 2 1 3 2
##  [2089] 3 3 1 1 2 3 2 1 2 3 3 3 2 2 3 2 3 2 2 3 2 2 3 3 3 1 3 1 1 2 2 2 2 1 3 2
##  [2125] 3 3 2 2 2 3 3 3 3 2 2 2 3 2 1 3 3 2 2 2 2 2 2 3 2 3 2 2 1 3 2 3 3 1 3 2
##  [2161] 3 1 3 3 3 3 1 2 3 3 2 3 3 3 1 3 3 1 3 2 2 3 1 2 2 2 3 2 2 1 1 3 3 1 3 2
##  [2197] 3 1 2 3 2 3 3 3 3 3 3 3 1 2 2 2 1 2 3 2 3 2 3 2 2 2 3 3 2 2 3 3 3 3 2 3
##  [2233] 2 3 3 2 2 1 2 2 2 3 3 3 2 3 3 1 2 2 3 1 2 2 2 3 2 3 2 3 2 3 3 3 1 2 2 3
##  [2269] 3 3 3 1 2 2 2 3 3 1 3 1 2 1 2 1 3 3 3 2 2 1 3 1 3 1 3 3 2 2 3 3 1 3 2 1
##  [2305] 2 3 2 3 3 2 3 3 3 2 2 2 3 2 3 1 1 3 3 2 1 3 2 2 2 2 3 2 2 2 3 1 1 2 2 3
##  [2341] 3 2 2 3 2 2 3 3 2 3 2 2 3 1 3 2 1 1 3 2 2 3 3 1 2 3 3 3 2 1 3 2 2 2 2 3
##  [2377] 1 3 1 2 3 2 2 2 2 2 3 2 3 1 2 2 3 3 2 3 1 1 3 3 3 2 3 2 2 3 2 3 3 3 3 2
##  [2413] 3 2 3 2 2 3 2 2 2 2 2 2 3 2 3 3 3 3 2 3 3 3 3 3 1 2 1 3 1 2 2 1 3 3 3 3
##  [2449] 1 2 3 3 2 2 3 3 2 2 2 3 2 3 3 3 1 3 3 3 2 3 3 3 2 2 2 2 3 3 2 1 2 3 2 3
##  [2485] 3 1 2 2 2 3 1 1 2 3 2 2 3 2 2 2 2 3 2 3 3 2 3 2 1 3 2 2 2 3 3 3 3 2 3 2
##  [2521] 3 3 3 2 2 2 3 2 1 2 3 3 1 2 3 3 1 3 3 1 3 1 3 2 2 3 3 3 2 3 2 3 1 2 3 2
##  [2557] 2 3 2 2 3 2 2 1 3 3 3 2 2 2 1 3 3 2 3 2 3 1 3 2 3 3 3 1 1 2 1 2 2 2 2 2
##  [2593] 2 1 2 2 3 3 2 2 2 1 3 2 2 3 1 3 2 1 3 2 3 2 1 2 3 3 1 3 1 2 3 1 3 1 3 2
##  [2629] 2 2 1 2 2 2 3 2 2 3 2 3 2 1 2 1 3 2 3 3 3 2 1 3 2 3 1 2 2 2 2 3 2 2 2 3
##  [2665] 3 2 3 2 3 3 3 2 3 3 2 1 1 3 2 2 1 3 3 3 2 3 1 2 1 1 2 2 2 3 3 3 2 2 2 1
##  [2701] 2 2 3 2 2 3 3 2 2 1 3 3 1 3 3 2 2 3 2 3 3 2 3 1 3 3 3 3 2 2 2 2 3 3 2 2
##  [2737] 3 3 3 2 2 2 3 2 1 2 2 2 1 2 3 1 2 2 3 2 2 2 1 1 3 3 2 3 3 3 3 3 3 3 2 1
##  [2773] 2 1 3 2 2 3 3 1 2 3 2 3 1 3 3 1 3 3 1 2 1 3 3 2 2 2 2 2 2 2 2 2 2 3 2 3
##  [2809] 3 3 2 2 3 3 2 3 2 2 2 2 3 3 2 3 2 2 3 1 2 2 2 2 3 1 2 2 3 2 3 2 2 3 3 1
##  [2845] 2 3 2 3 3 2 1 1 2 3 3 2 2 3 2 2 3 3 2 3 2 2 2 2 3 3 2 2 2 2 2 1 2 3 1 2
##  [2881] 2 2 3 3 1 1 3 2 3 2 2 3 3 1 2 2 2 2 2 2 2 1 2 2 3 1 2 2 2 2 3 2 3 2 3 2
##  [2917] 1 3 3 2 2 2 1 2 2 2 3 1 2 2 2 1 2 2 2 2 1 2 3 3 2 2 2 2 3 3 2 3 2 3 3 3
##  [2953] 3 3 3 2 3 3 2 3 2 1 2 3 2 3 1 2 3 1 2 3 2 3 3 1 3 2 3 2 3 1 1 3 3 3 3 2
##  [2989] 2 3 2 3 2 3 3 2 3 3 3 3 2 2 3 3 1 1 2 2 2 3 2 3 2 3 2 3 3 3 2 1 3 3 3 2
##  [3025] 3 2 3 3 2 3 1 2 3 2 2 3 2 3 1 3 2 2 3 3 2 3 2 3 3 3 3 3 3 2 3 3 3 1 2 2
##  [3061] 3 3 2 3 3 3 2 3 3 2 1 3 3 3 3 2 3 2 3 2 2 2 2 3 2 1 2 1 1 1 1 3 2 2 1 1
##  [3097] 2 3 3 2 3 2 2 3 2 1 2 2 3 2 3 3 2 2 1 2 2 1 1 3 2 2 2 2 2 2 1 3 1 2 3 2
##  [3133] 2 3 2 3 3 1 2 3 2 2 3 3 3 2 3 1 3 3 2 2 3 3 2 3 3 2 2 3 3 2 1 3 2 2 3 1
##  [3169] 1 2 1 2 2 2 3 2 3 3 2 2 2 3 3 3 2 3 3 3 3 3 3 2 3 2 3 3 3 2 3 2 2 2 2 1
##  [3205] 2 3 1 3 3 3 3 3 2 1 2 3 3 3 2 2 2 3 2 2 3 2 3 2 2 3 3 2 2 3 2 2 3 3 1 3
##  [3241] 3 1 2 3 2 3 2 2 2 3 3 3 3 2 2 3 1 3 3 3 3 2 2 3 3 2 3 3 3 2 1 3 3 3 2 2
##  [3277] 3 3 2 3 3 2 3 3 1 2 1 1 3 3 2 3 2 3 2 1 1 2 3 3 2 3 2 1 3 2 3 3 3 2 1 2
##  [3313] 2 3 2 3 3 3 3 2 2 1 1 2 1 2 2 3 3 2 2 3 2 1 2 1 1 2 3 3 2 3 2 3 3 1 2 3
##  [3349] 3 2 3 3 3 3 3 2 2 2 3 3 2 3 2 1 2 2 2 1 2 3 2 1 3 3 2 3 2 2 2 2 2 2 1 2
##  [3385] 2 3 2 2 2 3 2 2 1 2 3 2 2 1 3 1 1 2 2 2 2 3 2 2 2 3 3 2 3 3 3 3 2 2 2 3
##  [3421] 1 1 3 2 3 3 2 1 3 1 2 3 1 1 2 1 3 2 2 1 2 3 1 3 3 2 1 2 1 2 2 2 3 2 3 3
##  [3457] 2 3 1 1 3 2 1 3 3 2 2 3 2 2 2 3 1 2 3 3 3 2 2 2 3 2 1 2 3 3 2 2 2 2 3 3
##  [3493] 3 3 2 2 3 3 2 2 1 3 2 3 3 2 3 2 1 2 2 2 3 2 3 3 3 2 2 3 3 2 3 2 3 3 3 3
##  [3529] 2 3 2 2 1 2 2 1 1 2 3 2 2 3 2 2 3 1 1 1 2 2 2 1 2 1 1 2 2 2 3 3 3 3 2 2
##  [3565] 2 2 3 1 1 2 2 3 2 3 3 2 2 2 2 2 2 2 3 3 2 1 3 3 3 3 2 3 3 2 3 1 3 2 3 1
##  [3601] 2 1 1 2 2 3 3 3 3 2 2 2 3 2 3 3 1 3 3 2 2 2 2 3 2 1 2 2 1 3 2 1 1 2 2 2
##  [3637] 2 2 2 2 3 2 3 2 2 3 3 2 2 3 2 2 3 1 2 3 2 2 3 1 3 2 3 3 2 2 3 3 3 1 3 3
##  [3673] 2 2 2 3 2 3 3 1 3 1 2 3 1 2 3 2 2 2 2 2 3 2 2 3 3 2 3 3 3 2 3 2 2 3 2 1
##  [3709] 3 3 2 3 1 2 3 3 3 3 2 1 3 2 2 3 3 2 2 1 3 3 1 2 3 1 3 3 3 1 2 2 3 3 2 2
##  [3745] 3 2 3 3 1 2 3 2 2 2 2 2 2 2 2 2 3 3 2 2 2 2 3 2 3 3 2 2 1 2 2 3 2 3 2 3
##  [3781] 2 2 3 3 3 3 3 3 2 3 1 3 3 1 2 2 2 2 2 1 3 3 3 2 2 2 3 2 2 2 3 2 2 2 3 2
##  [3817] 3 3 3 3 3 3 1 2 1 1 1 3 2 3 3 2 2 1 2 1 2 2 1 3 1 1 3 3 2 3 1 3 2 2 2 3
##  [3853] 2 2 3 1 3 3 3 2 3 3 2 3 3 2 3 2 1 3 2 2 3 2 3 2 3 2 3 2 2 3 3 2 2 3 2 3
##  [3889] 3 2 3 2 1 3 3 1 3 2 2 1 2 3 3 2 3 3 3 2 3 3 2 3 3 2 2 1 3 3 2 3 3 1 1 3
##  [3925] 2 3 1 2 3 3 2 2 2 2 2 3 3 3 1 2 2 2 2 3 2 2 2 2 3 3 2 2 3 2 1 3 3 3 2 2
##  [3961] 3 2 3 2 3 2 3 2 3 2 3 3 2 3 3 1 3 1 1 3 2 3 2 1 3 2 2 1 2 2 1 2 2 1 1 3
##  [3997] 3 2 3 2 2 2 3 3 3 3 2 3 2 3 3 2 3 2 3 3 2 3 3 2 1 2 2 3 1 3 2 2 3 2 3 2
##  [4033] 3 3 3 3 3 2 2 2 1 1 3 2 2 2 1 3 2 2 3 2 2 3 2 2 3 3 2 3 3 2 2 3 3 1 2 3
##  [4069] 3 1 3 2 3 2 3 3 1 2 3 3 2 1 3 3 3 3 1 3 3 2 3 2 2 2 2 1 2 3 2 2 2 3 3 3
##  [4105] 3 3 2 2 2 3 3 2 3 3 2 3 3 2 3 3 3 3 2 3 1 3 3 3 2 3 3 2 2 3 1 2 3 2 2 3
##  [4141] 1 3 2 3 3 2 2 2 2 3 3 3 3 3 1 3 2 3 3 2 2 3 1 2 2 3 2 2 3 1 2 1 2 1 2 2
##  [4177] 2 1 3 3 3 3 1 3 3 1 2 3 3 3 2 2 3 2 3 1 2 3 3 2 2 1 2 2 2 2 3 3 2 3 3 3
##  [4213] 3 2 3 1 3 3 3 3 2 2 3 1 3 1 2 2 2 3 2 3 2 2 3 2 2 3 3 3 3 2 1 2 3 2 2 1
##  [4249] 2 3 2 3 1 1 2 2 3 2 2 2 3 3 2 1 2 2 2 3 3 2 2 2 1 3 1 2 3 3 2 2 2 3 3 3
##  [4285] 2 3 3 3 2 3 2 3 2 2 3 3 1 3 1 2 2 3 1 2 3 2 1 2 1 2 2 3 1 2 2 1 2 3 1 2
##  [4321] 3 2 3 3 2 2 2 3 2 3 2 1 2 2 3 1 2 3 2 3 3 2 3 3 1 3 2 2 2 2 2 2 1 2 3 2
##  [4357] 3 1 2 2 2 2 3 3 1 2 2 3 2 2 2 2 3 1 2 2 2 2 1 2 1 1 2 3 3 1 1 3 2 3 1 2
##  [4393] 3 2 1 3 3 2 3 1 1 2 2 2 2 1 1 3 2 3 3 3 2 2 1 1 3 3 3 2 2 1 3 2 3 3 2 3
##  [4429] 3 3 2 3 2 3 1 3 1 3 1 1 2 3 2 3 3 1 2 2 3 2 3 3 1 2 2 3 1 3 3 3 2 3 1 3
##  [4465] 2 2 1 3 2 3 3 1 3 2 2 3 3 3 1 2 3 1 3 3 2 3 2 3 2 3 1 2 2 3 2 2 2 2 2 2
##  [4501] 1 2 2 3 2 3 2 3 3 3 3 2 3 1 3 2 3 3 1 3 3 2 2 3 3 2 2 3 2 3 3 3 2 3 3 3
##  [4537] 3 3 2 1 3 2 3 2 3 3 2 2 3 2 3 3 2 2 3 2 3 3 2 2 3 3 3 2 2 3 2 3 3 2 2 3
##  [4573] 3 2 2 2 3 1 2 1 3 3 2 3 3 3 1 1 3 2 3 3 3 3 3 3 2 1 3 2 3 2 2 3 2 1 2 3
##  [4609] 3 1 3 2 3 1 3 3 3 3 3 3 2 3 1 2 2 3 3 3 3 1 2 3 3 2 3 3 2 3 1 1 2 1 2 2
##  [4645] 3 2 1 2 2 1 3 3 2 3 3 1 2 2 3 3 2 1 2 1 3 2 3 2 2 3 2 3 2 1 3 3 1 1 3 3
##  [4681] 1 2 2 2 3 1 3 2 3 3 1 2 2 3 3 2 3 3 1 2 2 2 3 1 2 3 2 1 2 3 2 3 2 2 3 3
##  [4717] 3 2 1 2 2 2 3 2 2 1 2 2 2 2 2 2 2 1 1 3 1 1 2 3 2 2 2 1 3 3 1 2 1 1 2 3
##  [4753] 3 3 2 2 3 3 3 2 3 3 3 2 1 3 3 2 2 3 3 3 3 3 2 2 1 3 2 3 2 3 1 3 2 3 2 2
##  [4789] 1 3 3 3 2 3 3 2 1 2 3 1 3 3 2 1 1 3 2 3 3 2 3 3 3 3 3 2 3 3 3 3 2 3 1 3
##  [4825] 3 3 2 2 1 3 3 2 3 3 3 2 2 3 3 3 3 3 2 3 2 2 2 2 3 1 3 2 3 3 3 3 3 2 2 2
##  [4861] 3 2 1 3 2 2 2 3 1 3 3 2 3 1 2 1 2 2 2 2 3 2 3 3 3 2 2 3 2 3 1 1 3 3 3 2
##  [4897] 1 3 2 3 3 1 3 1 1 3 2 2 3 2 2 2 1 3 2 3 3 1 2 3 2 2 3 3 2 2 2 3 3 1 1 2
##  [4933] 3 3 1 2 1 1 1 2 2 2 2 2 2 2 2 1 3 2 2 1 3 2 3 3 3 2 3 2 2 3 3 1 2 2 1 2
##  [4969] 3 1 3 2 1 3 3 3 1 3 2 2 3 2 1 2 3 2 3 2 3 2 3 3 1 2 2 3 2 2 2 2 2 2 2 3
##  [5005] 3 2 2 2 1 2 1 3 3 2 1 3 2 1 3 3 3 3 3 2 2 3 2 3 3 2 3 2 2 2 3 2 2 1 3 2
##  [5041] 3 2 2 2 1 3 1 3 2 2 2 2 3 1 3 3 3 2 3 2 3 2 2 2 2 1 1 3 2 1 2 3 2 2 3 1
##  [5077] 3 2 3 2 3 3 2 1 3 1 2 1 2 2 3 2 1 2 2 2 2 2 2 3 3 3 3 2 1 2 2 3 3 2 3 3
##  [5113] 3 3 2 3 2 3 2 3 2 2 2 3 2 1 3 2 2 3 1 3 3 3 1 3 3 1 2 2 3 1 2 3 2 3 2 2
##  [5149] 3 3 2 3 3 2 2 3 3 1 1 2 3 2 2 2 1 2 2 1 2 3 2 3 3 3 2 2 2 3 3 3 3 2 3 3
##  [5185] 1 2 3 1 2 2 2 2 1 2 3 3 2 2 2 3 1 3 2 2 3 2 2 2 2 1 2 2 3 3 3 2 3 2 3 2
##  [5221] 2 1 1 3 3 2 2 3 2 2 3 3 2 1 3 2 2 3 2 3 3 2 3 2 2 2 3 2 2 2 2 2 3 2 2 3
##  [5257] 3 2 1 2 3 2 2 2 3 2 2 1 3 2 3 2 3 3 2 3 3 3 3 2 1 3 2 2 2 1 3 2 3 2 3 1
##  [5293] 2 3 2 1 3 2 1 3 2 1 2 3 1 3 2 2 2 3 2 3 2 2 1 3 2 2 2 2 2 2 2 2 3 3 2 2
##  [5329] 3 3 1 2 2 2 3 2 2 3 3 1 1 2 3 3 2 2 3 2 1 1 3 3 2 3 1 2 1 1 1 2 2 3 2 3
##  [5365] 3 2 2 2 2 1 3 3 2 2 2 2 3 2 3 2 2 2 3 2 1 1 2 2 3 2 3 2 3 2 2 2 2 2 3 2
##  [5401] 3 2 3 3 2 1 3 1 3 3 3 3 3 2 1 2 3 3 2 3 2 3 1 2 3 2 3 2 3 2 3 2 2 2 2 1
##  [5437] 2 1 2 2 3 2 2 1 3 3 1 2 3 3 1 3 3 3 3 3 1 2 2 3 2 1 2 2 3 3 3 2 2 2 3 1
##  [5473] 3 1 3 2 3 2 2 1 2 2 1 3 3 3 3 3 2 2 3 2 1 2 2 1 1 3 2 2 2 3 3 3 2 1 2 2
##  [5509] 1 3 3 3 3 2 3 2 3 3 2 2 2 3 3 2 1 2 2 3 3 3 2 3 2 3 3 2 2 3 3 3 3 2 2 1
##  [5545] 3 2 3 2 2 3 2 3 1 2 2 2 2 2 3 3 1 3 2 3 2 3 3 2 3 2 3 3 2 2 3 3 3 3 2 2
##  [5581] 3 1 3 3 3 1 2 3 2 1 2 3 3 3 2 1 3 1 3 2 1 1 3 3 2 1 2 2 2 2 3 2 2 3 2 2
##  [5617] 1 2 3 1 2 3 3 3 2 3 3 2 2 1 2 2 2 3 2 1 3 2 3 3 2 2 3 1 2 2 2 2 3 3 2 1
##  [5653] 3 2 2 2 2 2 3 3 1 2 3 3 3 2 1 2 2 3 3 2 2 3 3 3 3 2 3 2 2 2 3 2 2 3 2 1
##  [5689] 2 2 3 2 2 3 3 3 2 3 3 2 2 3 3 3 1 2 3 1 2 2 2 3 3 2 2 1 3 2 2 2 2 3 3 1
##  [5725] 2 1 2 3 2 2 3 1 1 1 2 2 3 3 2 2 3 1 2 3 3 2 3 3 2 2 2 2 3 3 3 3 3 2 3 1
##  [5761] 2 2 2 2 2 3 2 2 2 2 3 2 3 3 2 3 1 2 3 3 1 2 2 3 3 2 3 3 2 2 3 2 2 2 2 2
##  [5797] 3 2 2 2 2 3 2 2 2 3 3 3 1 1 2 2 1 1 3 2 3 3 1 3 3 2 1 2 3 1 3 2 2 3 2 2
##  [5833] 1 2 2 3 2 3 1 3 1 2 2 2 2 1 3 3 2 3 3 3 1 2 2 3 1 3 2 3 2 3 3 3 2 3 2 1
##  [5869] 2 2 2 3 2 2 1 1 2 3 2 2 3 2 3 2 3 3 3 3 2 3 1 3 2 2 3 2 2 3 2 2 3 1 2 1
##  [5905] 1 2 1 1 2 3 2 1 2 1 3 2 2 2 2 2 2 3 2 1 2 1 3 3 2 3 1 1 1 2 3 3 3 3 2 2
##  [5941] 2 1 2 3 2 2 1 2 3 1 2 3 2 3 2 2 2 1 2 2 2 2 3 3 3 2 1 2 2 2 3 2 2 3 1 3
##  [5977] 1 2 2 2 1 3 2 1 2 3 3 3 1 3 3 2 2 2 2 2 2 2 2 3 3 2 1 2 2 3 2 2 1 2 3 3
##  [6013] 2 2 3 3 2 2 2 3 3 3 3 1 2 2 3 2 3 3 3 1 2 3 2 1 2 3 2 3 3 3 2 1 3 3 2 2
##  [6049] 2 1 1 2 2 3 3 1 1 2 1 2 3 2 2 3 3 1 3 3 3 2 2 3 3 3 2 2 2 3 1 2 2 2 1 2
##  [6085] 2 2 2 3 3 2 3 2 3 3 3 3 2 1 2 2 2 2 2 2 1 1 3 3 2 3 3 2 3 2 2 2 3 3 2 2
##  [6121] 3 1 3 3 2 3 1 2 1 2 2 2 2 2 2 1 2 3 3 3 3 3 1 3 1 3 3 2 3 3 2 3 3 3 2 2
##  [6157] 2 2 3 2 2 2 2 3 3 2 1 2 3 2 3 3 2 2 2 2 2 3 2 2 1 3 2 3 3 2 3 2 3 2 3 3
##  [6193] 3 1 3 3 3 3 2 2 3 2 2 2 3 2 2 2 2 1 3 2 1 1 2 3 3 2 2 3 3 2 3 2 3 2 2 3
##  [6229] 3 1 2 2 3 2 3 3 3 2 1 2 3 3 3 3 2 3 2 3 2 2 3 2 1 2 3 2 2 2 2 2 3 2 2 2
##  [6265] 2 1 1 2 3 3 3 2 2 3 1 3 1 3 1 3 2 2 3 2 3 3 3 3 2 3 2 2 1 3 3 2 2 3 3 3
##  [6301] 2 1 2 2 3 3 2 3 2 3 3 2 3 3 2 1 1 2 2 2 1 2 1 1 3 2 2 2 2 3 2 1 3 2 1 2
##  [6337] 2 2 3 1 3 3 3 3 3 3 3 3 3 2 2 2 3 3 2 3 2 2 2 2 2 3 3 3 3 2 3 2 3 3 3 1
##  [6373] 3 3 3 3 3 3 1 3 3 3 3 3 2 3 3 1 2 3 2 2 3 3 1 2 2 2 3 2 2 3 2 3 2 3 2 3
##  [6409] 3 1 2 3 2 3 3 1 3 1 2 2 3 2 3 3 2 2 2 1 2 3 2 1 2 2 1 3 3 2 2 3 3 3 2 2
##  [6445] 3 2 1 3 3 2 3 3 2 3 2 3 2 3 2 2 3 3 3 2 2 3 3 3 2 2 3 2 1 2 2 3 2 2 3 3
##  [6481] 2 1 3 2 2 2 3 2 2 1 2 2 3 2 3 2 3 2 2 1 2 1 3 1 1 1 2 1 2 2 2 3 1 2 3 2
##  [6517] 3 2 3 2 2 2 3 3 3 2 3 3 3 2 2 3 2 3 3 3 1 3 2 2 3 1 1 2 2 1 2 2 2 3 3 2
##  [6553] 1 3 1 3 3 2 2 1 3 3 2 2 2 3 3 3 2 2 3 3 3 2 1 2 2 3 3 2 3 3 3 1 2 3 1 2
##  [6589] 3 2 3 2 3 3 2 3 2 2 1 2 2 3 3 1 2 2 2 2 3 2 3 3 3 3 3 2 2 3 3 3 2 2 2 2
##  [6625] 1 3 3 2 2 3 2 2 2 3 1 2 3 1 2 1 2 3 2 2 2 3 1 1 3 2 3 2 2 2 2 3 3 3 2 3
##  [6661] 3 3 1 2 1 2 2 2 3 3 3 3 2 3 3 3 2 2 3 2 3 3 2 3 3 2 3 3 2 3 2 2 3 3 2 2
##  [6697] 3 3 2 1 3 1 2 3 2 3 2 3 2 1 2 2 2 3 2 1 1 3 1 2 3 3 2 3 3 2 3 2 3 3 3 3
##  [6733] 2 3 3 3 1 2 3 2 3 2 3 3 2 2 2 3 2 2 2 2 3 3 2 2 1 3 1 2 1 3 3 2 3 3 3 3
##  [6769] 3 2 1 3 3 3 2 3 2 3 2 3 2 3 1 2 3 3 3 3 1 3 3 1 1 3 2 2 2 2 3 3 3 1 1 2
##  [6805] 2 3 2 1 3 3 1 2 3 3 3 3 3 2 3 3 2 3 2 3 2 2 3 2 2 3 2 3 2 3 1 3 2 1 3 3
##  [6841] 3 3 3 3 3 2 2 2 2 3 3 3 3 2 3 1 3 3 3 2 1 3 2 3 2 3 1 3 3 3 2 3 2 2 2 2
##  [6877] 2 2 1 3 3 2 2 2 2 2 2 3 3 2 2 2 2 3 2 3 3 1 3 3 3 3 3 1 2 2 2 1 3 1 2 2
##  [6913] 3 2 3 3 2 3 3 2 3 2 3 3 3 3 2 2 3 3 3 3 3 2 2 2 3 2 2 2 3 3 3 2 3 2 3 3
##  [6949] 3 3 3 3 3 2 1 3 2 2 1 2 2 1 2 2 2 2 2 2 2 2 2 2 3 2 2 2 1 2 1 2 2 3 2 2
##  [6985] 2 3 3 3 1 2 3 3 3 3 2 2 2 2 3 1 1 2 3 3 3 2 1 2 3 1 2 3 3 1 3 1 3 1 3 3
##  [7021] 2 3 3 2 3 2 2 3 2 3 2 2 3 1 3 3 2 3 3 3 3 3 3 3 3 1 2 1 3 3 1 1 2 2 2 3
##  [7057] 2 3 3 3 1 2 3 3 3 2 2 3 1 2 3 3 3 3 3 2 3 2 2 3 3 3 2 3 2 3 3 1 3 1 3 2
##  [7093] 2 2 2 3 2 2 1 2 3 2 2 2 2 1 2 3 2 1 1 2 3 2 2 1 2 3 2 1 1 2 3 3 1 3 3 2
##  [7129] 2 3 3 3 2 2 3 1 2 3 2 3 2 1 2 2 1 3 3 1 2 2 3 1 2 1 3 1 3 2 2 2 3 3 3 2
##  [7165] 2 2 3 3 3 2 1 2 3 3 3 3 3 3 2 3 1 2 3 2 2 3 2 3 2 2 1 3 2 3 2 3 2 3 3 2
##  [7201] 2 2 3 2 3 2 3 1 2 3 3 3 1 2 3 3 2 2 3 1 2 3 2 2 3 3 3 3 3 3 2 3 2 2 2 2
##  [7237] 3 2 2 3 2 3 2 3 3 2 2 3 3 1 2 2 2 1 1 3 1 2 2 2 3 3 3 3 2 2 3 2 3 2 3 1
##  [7273] 3 3 2 3 3 3 3 2 3 3 3 2 2 2 1 3 3 2 2 2 2 3 2 2 2 1 2 2 3 2 3 3 2 2 3 3
##  [7309] 2 1 3 1 3 3 2 2 2 1 1 3 2 2 3 2 1 2 3 1 2 3 3 2 2 3 2 1 2 3 2 2 2 2 3 3
##  [7345] 3 3 2 2 3 3 2 2 2 2 3 3 3 3 3 2 2 2 3 2 3 3 3 1 1 2 2 3 2 3 3 2 3 2 3 2
##  [7381] 2 2 1 3 3 2 2 2 2 3 2 2 2 2 2 3 1 2 2 3 1 2 2 1 3 2 2 3 3 2 3 2 2 2 3 3
##  [7417] 1 2 2 3 3 3 2 3 3 3 2 2 2 2 2 1 2 2 2 3 3 2 2 3 2 1 3 3 2 3 3 1 1 3 2 3
##  [7453] 3 2 3 2 3 3 2 3 1 2 2 1 3 3 2 2 2 3 2 3 2 2 2 2 3 2 3 1 2 3 1 2 3 2 2 2
##  [7489] 3 3 3 2 2 1 3 2 2 3 1 2 1 3 3 2 2 2 3 3 1 3 2 2 2 3 3 2 3 2 3 2 3 2 1 3
##  [7525] 2 1 1 3 3 1 1 3 2 3 2 2 2 3 1 3 3 3 2 2 3 2 2 1 1 3 3 3 3 2 3 3 2 3 3 3
##  [7561] 3 3 2 3 1 3 2 1 3 3 2 2 2 3 2 3 3 3 2 1 2 1 3 2 2 3 2 2 3 3 2 3 3 1 3 2
##  [7597] 2 2 3 2 2 3 3 2 2 2 2 3 3 2 3 3 3 2 3 1 2 2 1 3 3 2 2 3 1 3 3 2 2 3 3 3
##  [7633] 2 1 2 1 2 3 2 3 3 2 3 2 3 2 3 2 1 2 2 3 1 1 1 2 2 3 1 2 2 3 1 3 3 3 2 3
##  [7669] 1 3 2 3 2 1 2 2 3 2 2 1 1 2 2 3 2 3 2 3 2 1 2 3 2 1 1 3 2 2 1 2 2 3 2 2
##  [7705] 3 3 3 1 3 3 2 2 2 3 3 1 2 3 2 2 3 3 2 3 1 3 3 2 2 3 2 2 2 3 3 2 3 2 3 3
##  [7741] 3 3 3 1 2 2 2 3 1 3 2 2 3 3 1 2 3 2 2 1 3 3 2 2 1 3 2 3 2 3 1 2 1 2 2 2
##  [7777] 3 3 2 3 1 2 2 3 3 2 2 1 3 1 3 2 1 3 3 2 3 2 3 2 2 2 1 2 2 2 2 2 3 1 3 3
##  [7813] 2 1 3 2 2 2 2 2 3 2 2 3 2 3 3 2 1 3 2 2 2 3 2 3 3 3 1 3 3 2 3 3 3 2 3 2
##  [7849] 2 2 1 2 2 2 1 1 3 3 3 2 3 2 2 1 2 2 3 3 2 1 2 2 2 1 3 2 3 3 2 3 3 2 2 3
##  [7885] 2 2 1 3 1 3 2 1 3 1 2 2 3 1 2 2 2 3 1 3 2 3 2 3 2 3 2 1 3 3 3 3 2 1 2 1
##  [7921] 3 1 1 2 3 3 3 2 3 2 3 3 3 2 3 3 3 2 1 2 3 3 2 2 2 2 1 3 2 2 2 3 1 3 2 2
##  [7957] 1 2 3 3 2 2 2 3 3 3 3 2 3 1 1 3 2 3 3 3 2 2 2 3 2 2 3 2 3 3 2 1 1 3 2 3
##  [7993] 2 1 2 2 1 3 2 3 3 3 3 3 2 2 3 3 2 3 3 3 2 2 3 2 2 3 3 1 1 3 2 3 3 2 2 3
##  [8029] 3 3 3 2 2 3 3 2 2 2 3 2 3 1 3 2 3 3 3 2 3 2 3 3 3 2 3 2 2 2 2 3 3 3 2 3
##  [8065] 2 3 1 3 3 2 3 3 2 2 1 3 3 2 3 3 3 2 3 3 3 1 2 3 2 1 3 2 2 3 3 2 2 3 3 2
##  [8101] 2 3 3 3 3 2 2 3 1 3 2 3 2 2 3 1 2 2 3 3 3 3 3 3 2 2 3 2 3 2 2 1 3 2 2 2
##  [8137] 1 3 2 3 3 3 2 2 3 2 2 2 2 2 2 2 2 1 3 1 1 2 2 3 1 2 3 2 3 3 3 3 2 2 3 2
##  [8173] 1 3 3 1 2 3 3 3 3 3 2 3 2 2 3 3 2 3 3 1 3 3 3 3 3 2 3 2 1 2 3 3 1 2 2 3
##  [8209] 2 3 2 2 2 1 1 2 1 3 3 2 2 2 1 3 3 2 1 3 3 2 2 3 3 2 3 3 3 1 3 3 3 2 2 2
##  [8245] 2 2 2 2 3 2 2 3 2 2 2 2 2 3 3 2 2 2 2 1 1 3 1 2 3 2 2 2 2 3 3 1 2 2 3 1
##  [8281] 2 3 2 2 3 3 3 3 3 1 1 2 3 3 2 2 1 2 3 2 2 3 3 2 1 1 3 3 2 3 1 2 2 3 1 3
##  [8317] 3 2 3 2 2 2 3 3 2 2 3 2 1 3 3 3 3 3 3 3 2 1 3 2 3 3 1 3 2 2 2 3 3 3 3 2
##  [8353] 2 2 2 2 3 3 2 2 3 2 3 2 3 2 3 3 3 3 2 1 3 2 2 3 3 1 2 2 3 3 2 2 2 3 3 2
##  [8389] 3 3 2 2 2 3 3 2 2 2 3 2 3 2 3 3 3 3 3 3 2 1 3 2 2 3 2 2 2 3 2 1 2 2 3 3
##  [8425] 2 3 3 3 3 3 1 1 2 3 3 1 3 2 3 3 2 1 3 3 1 3 1 3 3 3 2 2 2 2 1 2 3 2 2 2
##  [8461] 2 2 1 1 2 3 3 3 1 3 3 1 3 2 3 3 2 2 2 2 1 2 3 3 2 2 2 2 2 2 2 2 3 3 2 1
##  [8497] 3 2 2 2 3 3 3 2 3 1 2 3 2 2 3 2 2 2 2 3 3 2 2 2 2 2 2 2 2 3 1 3 3 3 3 3
##  [8533] 2 3 2 3 3 2 3 3 3 1 3 3 3 1 2 3 1 3 3 3 3 1 2 1 3 3 3 3 1 3 2 2 3 3 2 2
##  [8569] 2 1 2 3 2 3 3 3 3 1 1 2 3 3 3 2 3 1 1 2 2 1 2 3 3 3 1 3 2 2 1 3 2 3 3 2
##  [8605] 3 3 2 1 1 3 3 2 1 1 3 2 2 3 2 3 3 2 1 3 3 1 1 3 1 2 3 3 1 3 1 3 2 1 1 2
##  [8641] 2 1 1 2 3 2 3 3 3 3 2 1 2 3 2 3 3 2 2 3 3 2 2 2 3 2 2 3 2 2 3 3 3 1 2 2
##  [8677] 1 2 3 3 2 3 3 2 3 3 3 2 3 2 3 3 2 3 2 3 2 3 3 2 2 3 3 3 2 2 3 2 3 1 2 2
##  [8713] 2 1 1 3 1 2 3 3 1 3 2 2 2 2 2 2 2 3 2 1 3 2 3 2 2 2 1 2 3 3 2 3 2 3 2 1
##  [8749] 2 1 1 1 3 1 2 3 2 2 2 3 2 3 1 3 2 2 2 2 3 2 3 1 3 1 3 3 2 2 3 2 2 3 2 3
##  [8785] 3 3 3 3 3 1 1 3 2 1 1 2 3 1 1 3 2 1 2 2 3 3 3 2 3 2 2 2 2 3 2 3 3 2 2 3
##  [8821] 2 3 2 3 3 1 2 2 3 1 3 2 3 2 1 2 3 2 2 2 1 3 2 2 2 1 3 3 3 3 2 3 2 3 2 3
##  [8857] 3 3 3 3 3 3 2 2 3 1 3 3 1 3 2 2 3 3 3 3 2 2 3 3 2 3 1 3 3 2 2 1 3 3 2 2
##  [8893] 3 3 2 3 3 3 3 3 2 3 3 3 2 2 1 3 3 2 3 3 3 1 3 2 2 1 2 2 2 1 1 2 2 2 1 2
##  [8929] 3 1 2 2 2 3 1 3 3 2 2 3 3 2 2 1 2 3 2 1 1 3 3 2 3 3 1 2 3 1 3 1 2 2 2 3
##  [8965] 3 3 3 1 3 2 2 2 2 3 3 3 2 3 2 2 3 2 3 3 2 3 3 3 3 3 2 2 3 3 3 3 1 3 3 2
##  [9001] 3 2 2 1 1 2 3 2 3 2 1 2 1 3 1 2 2 3 2 1 2 2 1 3 3 2 3 1 2 1 3 3 3 3 2 2
##  [9037] 2 1 2 3 2 2 2 2 3 2 3 2 3 2 3 1 1 2 1 3 3 3 3 2 3 2 2 2 3 1 3 2 2 1 2 3
##  [9073] 2 2 2 2 1 2 3 2 1 3 1 2 2 3 2 2 3 2 1 2 3 3 3 2 2 2 3 2 3 2 2 3 3 3 3 2
##  [9109] 2 3 2 3 3 2 2 3 2 2 3 2 2 2 3 1 1 3 2 2 2 3 2 1 3 2 1 3 3 3 2 2 3 2 1 2
##  [9145] 1 3 1 2 1 3 3 3 2 2 3 2 2 2 2 3 3 1 2 3 2 3 2 3 3 2 1 1 3 2 3 3 2 2 3 2
##  [9181] 3 1 3 2 3 2 1 3 1 2 2 3 2 3 2 2 3 1 2 1 2 2 2 2 3 2 2 3 2 3 2 1 3 1 2 1
##  [9217] 3 1 1 3 3 3 1 3 2 3 3 1 3 1 1 1 3 3 2 2 3 3 2 3 2 2 2 3 3 2 3 2 3 1 2 2
##  [9253] 2 3 1 1 2 3 2 3 3 2 2 1 3 3 2 3 1 3 2 3 2 2 3 3 2 3 3 3 3 2 3 3 2 3 3 2
##  [9289] 3 3 3 2 2 2 2 2 3 3 2 3 3 3 3 1 1 3 2 3 3 2 3 2 2 2 2 2 2 3 2 2 2 2 3 3
##  [9325] 2 3 3 2 2 1 2 1 2 3 2 2 2 2 2 1 2 2 3 2 2 3 3 2 3 3 2 3 3 3 1 1 2 2 1 3
##  [9361] 2 2 1 3 3 1 1 3 2 1 2 2 2 3 1 2 2 1 3 3 3 2 2 2 2 3 2 2 2 2 2 3 3 2 1 3
##  [9397] 2 3 3 3 3 3 2 3 3 2 2 2 1 3 3 2 2 2 1 3 3 3 2 3 1 2 3 2 1 2 2 2 3 2 1 2
##  [9433] 3 2 2 3 2 2 3 1 3 2 3 2 3 3 2 2 2 2 2 2 3 3 3 2 2 1 3 1 3 3 2 2 3 2 2 2
##  [9469] 2 3 3 2 2 1 2 3 2 2 3 3 2 3 1 3 3 3 2 2 2 2 3 3 2 2 2 3 3 3 1 2 3 3 2 2
##  [9505] 3 3 2 2 3 2 2 2 1 2 2 1 3 1 2 2 2 3 3 3 3 3 2 3 3 3 3 3 2 2 1 3 3 2 2 2
##  [9541] 3 2 2 2 1 2 3 3 2 2 2 3 3 3 2 2 2 3 3 3 1 2 2 2 2 3 3 2 2 2 3 2 2 2 3 3
##  [9577] 2 3 2 2 3 2 3 2 2 3 2 3 3 1 3 2 3 3 3 3 1 1 3 2 1 2 3 3 3 3 2 2 1 3 2 2
##  [9613] 2 2 2 3 2 3 3 3 2 2 3 1 3 3 3 2 3 2 3 3 3 2 3 3 3 2 2 2 3 1 2 3 3 2 2 1
##  [9649] 3 3 3 1 3 2 1 3 2 3 2 2 3 3 2 3 2 2 1 3 2 3 3 1 3 2 3 2 2 1 1 3 2 3 1 1
##  [9685] 2 1 1 3 1 2 3 3 3 3 3 2 2 3 3 3 3 1 3 3 1 3 1 2 3 2 2 3 2 2 3 2 2 2 2 3
##  [9721] 2 3 2 2 3 3 1 2 2 2 1 3 2 2 2 2 2 3 2 3 3 2 2 3 2 3 3 3 3 2 3 1 1 3 3 3
##  [9757] 3 2 2 2 3 3 2 2 2 3 2 2 2 2 1 3 2 2 2 3 2 2 2 2 3 1 3 2 2 3 3 2 2 2 3 2
##  [9793] 1 3 2 3 2 1 1 3 2 2 3 3 2 2 3 3 1 3 3 2 2 3 3 2 2 3 3 2 3 3 3 3 1 2 3 2
##  [9829] 2 3 3 1 3 2 2 3 2 2 3 2 1 2 1 2 3 3 2 2 2 2 1 3 2 3 1 2 1 3 2 3 2 2 3 2
##  [9865] 2 3 2 3 2 2 3 2 2 3 3 2 2 2 2 1 3 3 2 3 2 1 3 1 3 3 2 1 3 2 3 2 1 3 1 2
##  [9901] 3 1 2 1 3 3 2 2 3 2 2 2 2 1 2 3 3 3 2 2 1 3 2 2 3 3 2 2 1 2 1 2 2 1 3 2
##  [9937] 3 3 2 2 2 1 3 3 2 3 3 3 2 3 3 2 3 2 3 3 1 2 3 3 2 2 1 3 2 1 2 3 1 2 2 2
##  [9973] 3 3 3 1 2 3 2 1 2 2 2 3 2 3 2 3 2 3 3 3 3 3 2 3 2 2 3 2 3 2 3 3 2 3 3 2
## [10009] 2 1 3 3 1 2 2 2 2 3 1 3 1 3 3 2 2 1 3 2 3 1 2 3 1 2 2 3 2 2 2 1 3 3 2 3
## [10045] 3 3 3 2 2 1 3 2 2 2 3 2 1 2 2 2 3 3 1 3 2 1 2 2 1 1 1 3 3 1 1 3 1 3 1 3
## [10081] 2 1 3 3 2 1 2 1 1 2 3 2 2 2 1 2 3 3 2 1 3 2 1 2 1 3 1 3 1 2 3 2 3 3 2 1
## [10117] 3 3 3 2 3 2 2 2 1 1 3 3 3 3 2 3 3 2 2 2 2 2 2 3 3 3 2 2 2 3 2 3 3 1 2 2
## [10153] 1 3 2 2 1 2 1 1 3 3 2 1 3 3 3 2 2 2 3 2 1 1 3 2 2 1 3 2 2 2 3 3 1 1 2 1
## [10189] 2 3 2 2 1 2 2 2 1 3 3 3 3 1 1 2 2 2 2 1 3 2 1 2 3 3 1 3 3 2 3 1 2 3 2 2
## [10225] 2 2 1 3 3 3 2 2 2 2 3 2 2 1 2 2 1 2 1 3 2 2 3 3 1 2 3 1 3 1 1 3 3 3 1 2
## [10261] 1 3 1 2 2 2 2 3 3 3 1 2 3 2 3 1 2 3 3 3 2 3 3 2 2 2 2 2 2 2 3 3 2 2 3 2
## [10297] 3 3 3 3 2 1 2 3 3 2 2 2 2 3 2 2 3 3 3 2 2 1 1 2 2 2 3 2 2 1 1 1 2 3 2 2
## [10333] 2 1 1 2 2 1 1 2 3 2 2 2 3 2 2 2 3 2 2 1 3 2 3 3 3 2 2 2 1 2 1 1 2 3 2 3
## [10369] 1 3 3 3 2 3 3 3 2 2 3 2 2 2 1 3 3 2 3 1 2 2 1 1 2 3 3 2 1 3 2 2 2 2 3 2
## [10405] 1 3 2 3 2 3 2 3 1 3 3 1 3 2 2 3 3 3 3 3 2 3 3 3 2 2 2 3 2 2 2 2 2 2 3 3
## [10441] 1 1 1 2 2 2 3 3 1 2 3 2 1 3 2 2 3 2 2 2 3 2 3 2 2 2 3 3 3 2 1 2 2 2 3 2
## [10477] 3 3 1 3 2 2 2 1 2 2 2 3 2 3 3 3 2 1 2 2 1 3 2 2 1 2 3 2 2 2 3 2 2 3 2 2
## [10513] 2 3 2 2 3 2 2 2 2 2 1 1 1 2 3 3 2 2 2 2 2 2 3 2 3 3 2 1 3 2 3 3 3 1 3 2
## [10549] 3 1 3 2 1 3 3 3 1 3 3 2 2 3 2 3 3 2 2 3 3 2 3 1 3 3 3 2 3 2 1 2 3 2 2 3
## [10585] 2 2 2 2 2 3 2 2 2 3 3 2 2 1 2 3 2 3 3 3 3 3 2 3 2 2 3 2 2 2 2 2 2 3 2 1
## [10621] 2 2 3 3 2 3 3 3 2 3 3 2 2 2 2 2 2 2 2 2 2 3 3 3 3 1 2 3 2 2 3 3 3 1 3 2
## [10657] 1 3 3 3 3 1 1 2 3 2 2 2 3 3 2 2 2 3 2 3 2 1 3 2 3 1 2 2 3 3 2 2 3 2 3 2
## [10693] 2 2 3 2 2 3 3 1 2 3 3 3 3 3 1 2 1 3 3 3 3 2 2 3 3 2 3 2 2 2 3 3 3 3 3 2
## [10729] 3 2 2 3 3 2 3 3 3 1 3 2 3 2 2 2 3 1 3 3 2 1 2 2 3 2 3 2 2 3 2 1 2 2 2 2
## [10765] 2 2 1 1 3 2 1 3 2 3 2 1 2 2 3 3 3 1 2 2 2 2 3 3 2 2 3 3 2 3 3 2 3 3 2 2
## [10801] 2 3 2 1 2 2 3 2 2 1 3 2 3 2 2 2 3 2 2 3 3 3 3 3 2 2 1 1 1 1 2 2 2 2 3 3
## [10837] 1 2 2 3 3 3 2 2 2 2 2 3 3 2 2 3 3 2 2 3 3 3 3 2 3 3 1 1 3 3 2 2 1 3 2 2
## [10873] 2 3 2 2 3 3 2 2 3 3 3 3 2 3 3 2 2 3 3 1 2 1 3 2 2 3 2 3 2 1 2 2 3 3 3 3
## [10909] 2 3 3 1 3 2 2 3 3 2 3 2 2 3 3 2 3 3 1 3 2 2 2 2 3 3 3 2 3 3 2 3 1 3 3 1
## [10945] 1 3 3 3 3 1 2 2 3 3 2 2 2 3 3 2 1 3 3 2 3 3 2 2 3 2 3 3 3 3 1 1 2 2 2 1
## [10981] 2 2 2 1 2 2 3 3 2 3 3 3 2 3 2 3 3 3 1 3 3 2 3 2 2 2 2 1 3 2 3 3 2 3 2 1
## [11017] 2 3 2 2 1 2 3 2 1 3 1 3 3 2 3 2 3 2 2 2 3 3 2 2 3 2 2 3 2 3 2 3 3 3 3 1
## [11053] 1 3 3 1 2 2 2 2 2 3 3 2 1 1 2 2 2 2 3 3 2 3 1 2 2 3 2 2 2 3 2 2 3 3 3 2
## [11089] 3 3 2 1 3 3 1 2 1 2 2 1 2 2 3 3 3 3 3 2 3 2 1 3 3 2 1 1 2 3 2 3 3 1 3 3
## [11125] 3 1 1 1 2 2 3 1 2 2 3 3 3 3 3 2 3 2 3 2 2 3 3 2 3 2 3 3 1 1 1 2 2 3 2 3
## [11161] 2 3 3 2 2 3 2 3 2 3 1 2 2 2 2 2 2 3 2 3 1 2 3 3 2 3 2 3 3 1 3 2 3 3 2 3
## [11197] 3 3 3 1 2 1 2 3 3 3 3 3 1 3 2 2 1 2 3 1 2 1 3 2 2 2 2 2 1 1 1 2 2 3 2 3
## [11233] 3 3 3 2 1 3 3 3 2 1 3 3 2 3 3 2 2 2 2 2 2 2 3 2 2 3 2 3 2 3 3 1 3 3 1 3
## [11269] 1 2 2 1 3 3 3 1 2 3 3 2 3 2 1 3 2 3 3 3 1 3 3 3 3 1 2 2 3 2 1 1 2 2 2 3
## [11305] 1 3 3 3 3 2 3 1 1 1 3 3 2 1 1 3 3 3 2 3 1 3 2 2 2 1 3 2 3 1 2 2 2 3 1 1
## [11341] 1 2 1 3 3 2 3 2 3 2 2 3 3 2 3 2 3 1 3 3 3 3 2 2 3 3 2 3 3 3 2 2 2 3 2 2
## [11377] 2 1 2 1 3 3 2 1 2 3 1 2 1 2 2 2 2 3 1 3 2 3 2 2 3 2 2 3 2 3 1 2 2 3 2 2
## [11413] 2 3 2 2 3 3 1 2 2 3 3 2 3 3 3 3 3 3 3 3 2 2 2 2 1 3 1 2 2 3 3 2 2 2 3 2
## [11449] 3 2 3 1 2 2 2 3 1 1 2 2 2 3 2 3 3 2 2 3 3 3 2 3 3 3 2 3 3 3 3 2 3 1 2 3
## [11485] 2 3 3 3 1 3 2 1 2 2 1 3 2 2 2 2 2 3 2 2 3 3 3 2 2 2 2 3 2 3 3 2 2 3 2 2
## [11521] 1 1 2 2 1 2 2 3 2 3 2 1 3 3 1 3 3 1 2 2 3 2 2 2 3 1 2 2 2 3 3 2 1 2 3 3
## [11557] 1 3 2 3 1 3 2 3 3 2 1 2 2 2 2 2 3 3 3 3 3 3 3 3 3 2 1 2 2 3 1 2 2 2 1 3
## [11593] 2 1 2 3 3 3 3 3 1 2 2 1 3 2 3 3 2 2 2 2 3 2 2 2 3 3 2 3 2 3 2 3 3 3 3 3
## [11629] 3 2 3 2 2 2 2 1 2 1 3 1 2 3 2 2 2 3 3 3 3 2 3 3 2 3 3 2 3 3 3 3 3 2 2 3
## [11665] 2 1 3 1 2 2 3 2 1 2 3 3 2 3 1 2 2 3 2 2 3 2 2 1 3 2 2 3 2 2 3 3 2 2 2 1
## [11701] 2 2 1 3 2 2 3 3 2 3 3 3 3 3 2 3 2 3 3 2 3 2 3 2 2 3 3 3 2 2 1 3 3 1 3 3
## [11737] 3 2 3 3 2 2 3 2 3 3 3 1 3 1 3 3 3 2 3 3 3 3 2 2 3 3 3 3 2 2 2 2 2 2 2 1
## [11773] 2 3 3 1 2 2 2 2 2 2 2 3 2 2 2 3 2 2 3 3 3 2 2 3 1 1 3 2 3 3 2 3 2 3 3 2
## [11809] 2 1 2 2 1 2 3 3 2 2 2 3 3 2 3 2 1 1 2 2 2 1 2 3 3 3 3 1 2 3 3 1 3 1 1 2
## [11845] 3 2 2 2 1 1 2 2 3 1 1 3 2 2 2 3 3 2 3 2 2 3 2 2 3 2 3 3 2 3 2 2 3 2 2 3
## [11881] 2 2 3 1 2 1 2 3 1 3 2 3 2 2 3 2 3 3 2 2 3 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3
## [11917] 2 2 3 2 1 1 3 3 3 1 2 3 1 2 3 2 3 3 1 3 3 2 2 2 3 1 2 2 2 1 2 2 1 3 1 2
## [11953] 2 2 2 2 3 3 2 2 3 3 2 2 3 1 1 2 1 3 2 3 2 3 2 3 3 2 2 1 3 3 1 3 1 1 3 2
## [11989] 1 3 3 3 3 2 2 3 2 2 2 1 3 3 3 1 3 2 3 3 2 2 2 3 2 2 3 2 3 3 1 3 1 3 3 3
## [12025] 3 3 3 2 1 1 3 3 3 2 3 3 3 2 2 3 3 1 3 1 3 2 3 1 2 2 3 3 3 3 2 2 2 3 3 3
## [12061] 2 2 3 3 2 3 2 3 3 2 1 2 3 3 2 2 2 3 1 3 1 3 1 3 2 3 2 2 3 2 3 2 2 3 2 3
## [12097] 3 2 3 2 3 3 3 2 3 2 3 2 3 2 2 3 3 3 2 2 2 3 3 2 2 2 3 2 3 2 2 1 3 3 1 3
## [12133] 3 1 2 2 2 2 3 2 2 3 3 2 3 2 2 2 2 3 3 3 2 3 1 2 2 3 3 2 3 2 3 3 3 1 3 2
## [12169] 3 2 2 3 2 3 3 3 2 2 1 2 2 3 2 2 3 3 3 2 2 2 3 3 2 3 2 1 2 2 2 2 2 2 3 3
## [12205] 3 2 3 3 2 3 2 2 2 1 2 1 3 3 2 1 1 2 2 3 2 2 2 3 1 2 2 1 3 3 1 1 1 3 1 3
## [12241] 2 2 2 3 2 3 3 2 3 2 2 3 1 3 3 2 1 2 2 3 2 3 2 3 3 2 3 3 1 2 3 3 2 1 3 2
## [12277] 2 3 3 2 3 3 3 2 3 2 2 3 3 3 2 3 1 3 2 2 3 2 3 2 3 2 2 3 2 3 3 2 3 2 2 2
## [12313] 2 2 2 3 2 2 1 3 2 3 2 3 2 3 2 3 3 3 1 2 3 3 3 3 2 3 2 2 2 3 3 2 2 2 3 3
## [12349] 3 2 3 2 3 3 2 2 2 3 2 3 2 3 2 2 1 2 3 3 3 2 2 3 2 2 2 2 3 3 2 1 3 3 2 2
## [12385] 3 2 2 1 2 2 3 3 2 1 2 3 2 2 1 3 3 1 1 2 3 3 2 1 3 1 3 1 3 2 2 2 2 3 2 2
## [12421] 2 2 2 3 2 3 3 3 3 3 2 3 3 3 2 2 3 2 2 2 3 2 3 2 1 2 3 1 3 2 3 3 2 3 3 1
## [12457] 3 3 2 1 3 2 3 3 3 3 3 2 2 3 2 3 2 3 2 3 2 1 2 3 3 2 2 3 3 3 3 3 1 2 2 2
## [12493] 3 3 3 2 1 2 2 2 3 3 3 3 2 1 3 2 2 2 2 2 2 1 2 2 3 3 2 3 3 1 2 3 1 2 3 2
## [12529] 3 3 2 2 2 2 1 3 3 3 1 3 2 3 3 1 2 1 2 1 2 1 3 2 2 3 2 3 3 3 1 2 3 3 3 1
## [12565] 3 1 2 2 2 3 2 2 3 2 1 3 1 3 3 1 1 3 2 2 3 3 2 3 3 2 2 3 3 2 3 2 2 2 3 3
## [12601] 3 2 2 3 1 1 3 2 2 3 2 1 2 3 3 2 2 3 3 1 3 3 3 2 2 2 2 3 2 1 2 3 3 3 2 3
## [12637] 2 3 3 3 2 3 1 2 2 2 3 2 3 2 3 1 3 2 2 3 2 3 1 3 3 1 1 1 3 3 2 1 2 3 3 3
## [12673] 1 3 3 2 2 2 3 3 3 3 2 3 3 2 3 1 3 3 1 3 3 2 2 3 2 2 1 2 3 2 2 3 2 2 2 3
## [12709] 3 3 2 3 1 3 3 1 2 3 3 3 2 3 3 2 3 2 3 2 2 3 3 3 3 3 3 2 3 3 2 2 2 2 2 2
## [12745] 3 3 2 1 3 1 2 1 3 3 3 2 3 2 3 2 2 1 2 3 2 2 1 3 3 3 3 2 3 1 2 3 2 3 3 2
## [12781] 2 3 2 1 3 3 3 3 2 3 2 1 3 3 2 2 2 3 1 2 3 3 3 2 2 1 3 2 3 3 3 3 2 3 2 1
## [12817] 2 2 3 3 3 3 1 2 1 2 2 2 3 3 2 2 3 2 2 2 3 3 2 2 3 2 3 1 3 2 3 1 3 2 3 3
## [12853] 2 3 2 1 2 3 3 2 2 3 2 3 3 3 3 2 2 2 3 2 2 2 2 1 2 2 3 3 2 2 3 2 2 3 2 2
## [12889] 2 1 1 2 3 1 2 3 2 2 3 3 3 3 2 2 3 2 1 3 1 3 3 3 3 3 2 2 3 3 2 2 2 2 1 2
## [12925] 3 3 3 3 2 1 2 1 1 3 2 2 2 3 2 3 2 2 2 1 2 3 3 3 3 2 2 3 2 3 3 1 3 3 1 2
## [12961] 3 2 1 2 3 2 2 2 3 2 2 2 2 1 2 2 2 2 2 1 2 1 1 2 1 2 3 2 3 2 3 3 2 3 3 2
## [12997] 2 2 3 2 3 2 1 3 2 1 3 2 2 2 2 3 1 2 3 2 3 3 2 3 2 2 3 1 3 1 2 1 2 2 3 2
## [13033] 2 1 3 2 3 2 3 2 2 2 3 3 1 3 2 3 1 1 2 3 2 3 3 1 3 3 2 2 3 3 1 2 3 2 2 2
## [13069] 2 2 1 3 2 3 3 3 3 3 3 2 3 3 3 1 2 3 2 3 3 3 3 2 2 1 3 3 2 3 2 2 1 2 3 2
## [13105] 3 3 1 3 2 2 2 2 2 2 3 3 2 2 2 2 3 2 2 3 3 2 2 3 3 3 2 3 3 2 2 3 2 3 2 3
## [13141] 3 2 1 3 1 2 2 2 3 2 3 2 3 3 3 2 2 3 2 3 2 1 3 2 2 3 3 1 3 1 2 3 2 2 3 2
## [13177] 2 1 3 2 3 3 2 2 2 2 3 3 2 3 3 2 2 1 1 3 3 2 3 2 2 3 1 3 2 2 2 3 2 1 3 3
## [13213] 3 2 3 2 3 2 1 3 3 3 2 3 2 2 2 3 1 3 1 3 3 1 2 2 2 2 3 3 3 2 3 2 2 2 2 3
## [13249] 2 2 3 3 3 3 2 2 3 2 3 2 3 3 1 2 3 3 3 2 2 1 2 1 3 3 3 3 3 1 3 2 2 3 1 2
## [13285] 2 3 2 3 1 3 2 2 2 3 1 2 3 1 2 2 3 3 1 2 3 2 2 2 1 2 2 3 3 3 3 3 2 2 1 1
## [13321] 2 3 3 2 1 2 2 3 3 2 2 3 1 2 1 3 3 3 2 1 3 2 2 3 2 3 1 1 2 3 3 2 2 3 3 3
## [13357] 1 1 3 3 3 3 2 3 3 2 3 3 2 2 3 1 2 2 2 3 3 2 1 3 2 3 2 3 3 3 1 2 3 3 3 2
## [13393] 3 1 2 2 3 2 3 1 2 3 3 3 2 3 1 2 2 3 3 3 3 3 1 1 3 3 2 2 2 3 2 3 2 3 3 3
## [13429] 2 3 3 2 2 2 1 3 2 3 2 3 2 2 2 3 3 2 2 2 2 1 3 3 3 3 3 3 2 2 3 2 3 2 2 2
## [13465] 1 2 2 3 2 3 2 2 3 2 3 2 1 3 2 1 2 1 2 3 2 3 2 2 1 2 3 2 3 2 2 2 1 3 3 2
## [13501] 3 3 2 3 2 3 3 3 2 3 3 2 2 2 2 3 3 3 2 3 3 3 3 3 3 2 2 3 3 3 3 2 3 2 3 3
## [13537] 3 1 3 3 3 3 2 3 3 2 3 3 1 2 2 2 3 2 2 3 3 1 2 1 2 3 2 3 2 3 2 1 2 2 3 2
## [13573] 3 3 3 2 3 3 2 2 2 2 2 2 2 2 2 3 2 3 3 2 3 1 2 3 1 2 3 2 3 2 2 3 3 2 3 3
## [13609] 2 1 2 3 2 2 2 2 3 2 2 1 3 3 2 3 3 2 2 3 3 2 3 3 2 2 2 2 2 3 3 2 2 1 3 2
## [13645] 3 1 3 3 3 1 3 1 2 2 2 2 2 2 1 2 2 3 2 3 2 2 1 3 1 1 3 2 1 2 2 1 2 2 3 3
## [13681] 3 1 3 3 2 3 2 1 3 2 1 2 2 3 2 1 3 2 3 3 3 3 2 3 2 2 3 2 2 1 3 2 3 3 2 2
## [13717] 1 2 2 3 3 1 1 3 3 3 3 2 3 2 2 3 3 1 2 2 2 2 3 2 2 2 2 1 2 2 2 2 3 2 2 3
## [13753] 1 2 1 3 3 2 2 3 2 3 2 3 2 3 2 3 2 3 3 3 2 3 2 2 3 2 1 3 3 2 2 2 2 2 2 3
## [13789] 2 1 3 1 1 1 3 2 2 3 3 3 1 2 1 2 1 1 2 1 2 2 3 3 2 2 1 2 2 2 2 2 3 2 3 2
## [13825] 3 3 3 3 3 3 1 3 3 2 2 3 3 2 2 3 2 2 3 3 2 3 2 3 2 3 2 3 2 2 2 2 3 2 3 2
## [13861] 1 2 2 2 3 2 3 2 3 3 3 3 2 2 1 3 3 3 3 2 3 2 3 3 3 3 2 1 1 3 3 2 3 1 3 3
## [13897] 3 2 1 2 2 2 3 3 3 2 3 2 2 3 2 2 3 2 2 3 2 3 1 3 3 3 1 2 3 2 3 2 2 3 3 3
## [13933] 2 3 1 2 2 3 3 3 2 3 3 3 2 2 2 3 3 1 2 2 3 3 2 1 2 3 3 3 2 1 3 3 2 2 2 3
## [13969] 3 1 2 1 2 3 3 1 2 3 2 2 3 3 2 2 3 3 2 2 2 2 2 3 2 2 3 3 3 2 2 3 3 2 3 2
## [14005] 3 3 2 3 3 1 1 2 2 1 2 2 3 3 2 3 2 3 3 3 3 3 2 1 2 2 3 1 2 2 3 2 2 1 3 1
## [14041] 1 2 2 2 2 3 2 2 2 3 3 3 1 3 3 2 2 2 2 2 2 3 2 3 2 2 3 2 3 1 3 3 3 2 3 2
## [14077] 1 3 2 3 2 1 2 1 1 1 2 3 3 2 3 3 2 3 3 2 2 2 2 2 1 2 3 3 1 3 2 2 2 3 3 3
## [14113] 2 2 2 3 1 3 1 2 2 2 3 2 2 2 3 3 2 2 3 1 2 3 3 2 3 3 2 3 2 2 1 2 3 1 3 3
## [14149] 2 1 2 1 3 1 1 2 3 3 2 2 3 2 2 3 1 2 3 1 3 1 3 1 1 1 1 2 3 2 2 2 2 3 2 3
## [14185] 3 2 2 1 2 2 2 3 3 2 2 2 2 2 1 2 3 3 3 3 2 2 3 3 2 2 1 1 1 2 2 2 3 3 2 2
## [14221] 2 2 2 3 1 3 2 2 2 2 3 2 3 2 2 1 2 2 3 1 3 2 2 2 1 2 1 2 3 2 3 2 2 3 1 3
## [14257] 1 2 3 2 1 2 2 2 3 1 2 3 3 3 3 2 1 3 3 2 2 2 3 2 3 3 2 2 2 2 3 2 3 2 3 3
## [14293] 3 3 3 2 3 2 2 3 2 1 1 3 2 3 2 1 3 3 3 3 3 3 2 3 2 2 2 3 3 2 2 2 3 2 2 2
## [14329] 2 3 2 2 2 3 2 2 2 3 3 2 2 1 1 2 2 3 1 1 1 3 3 3 2 3 2 2 3 1 3 1 2 3 1 2
## [14365] 3 3 2 2 3 2 3 1 3 3 3 3 2 1 3 2 2 2 2 2 2 3 1 3 2 3 3 2 2 2 2 3 1 3 2 3
## [14401] 2 3 2 3 2 1 3 1 3 2 3 2 3 3 1 3 3 1 3 1 3 2 3 2 2 1 2 3 2 2 3 3 3 3 3 2
## [14437] 3 2 2 3 3 3 3 2 2 3 3 3 1 2 3 3 2 2 3 2 2 1 1 3 2 3 2 3 2 1 3 3 1 2 2 2
## [14473] 1 2 3 1 3 2 3 2 3 3 2 3 2 1 2 3 3 2 3 2 3 1 3 2 3 2 2 3 3 2 2 3 2 3 3 3
## [14509] 3 2 2 2 3 1 2 3 2 3 3 3 3 3 2 3 3 1 2 2 1 2 1 2 3 3 2 1 3 3 2 3 2 3 2 1
## [14545] 3 3 2 2 3 1 3 2 3 2 2 3 3 3 1 3 3 3 3 2 3 3 3 3 1 2 2 3 2 3 2 2 1 3 3 3
## [14581] 1 2 3 3 1 3 2 2 1 2 3 2 1 3 1 3 2 1 2 2 2 3 3 1 3 2 3 2 2 3 3 2 3 3 1 2
## [14617] 2 2 1 3 2 3 2 1 2 2 1 2 1 1 2 2 1 1 2 3 1 2 3 3 2 3 2 1 1 3 3 3 3 3 3 2
## [14653] 3 3 2 3 3 2 2 3 2 3 2 2 2 2 3 2 2 1 3 1 2 2 3 3 2 3 1 3 2 3 2 3 3 2 2 1
## [14689] 3 2 3 2 3 1 1 2 2 3 2 3 2 2 1 3 3 1 3 2 2 3 3 3 2 2 2 3 3 3 3 3 2 2 2 2
## [14725] 2 3 1 2 3 2 1 3 3 2 3 1 3 3 3 2 2 2 3 3 3 2 2 3 3 1 3 1 3 1 3 3 3 2 2 1
## [14761] 3 2 3 2 3 1 2 1 1 1 2 2 2 3 2 3 1 2 3 2 2 2 1 2 2 1 3 3 2 2 2 1 2 3 2 3
## [14797] 2 3 2 2 3 2 2 2 2 3 3 3 1 3 1 3 3 2 2 2 2 2 1 3 2 2 2 2 3 2 1 2 3 2 2 3
## [14833] 3 2 3 2 2 3 2 3 2 1 3 2 1 3 2 2 3 2 3 1 2 2 2 2 3 2 2 3 2 1 1 3 3 3 3 3
## [14869] 1 2 3 1 3 3 3 1 1 2 3 3 2 3 3 3 2 3 2 1 3 2 3 2 1 2 2 2 2 2 2 3 3 1 2 3
## [14905] 3 2 2 1 3 2 3 2 3 3 3 3 3 2 2 2 3 3 2 3 2 2 3 1 3 2 3 2 3 3 2 3 2 1 2 2
## [14941] 2 2 3 3 2 3 3 2 1 2 3 2 2 2 2 3 1 2 2 2 3 3 3 3 2 2 2 2 1 2 2 3 3 2 3 2
## [14977] 3 1 2 3 3 2 3 3 1 3 1 2 1 2 1 2 2 3 3 3 3 2 3 2 3 2 2 3 2 2 1 3 3 1 2 3
## [15013] 2 2 3 1 3 3 3 2 3 1 3 3 3 3 2 2 1 3 3 2 3 1 3 3 2 1 2 2 3 2 2 1 1 3 3 2
## [15049] 3 3 3 3 1 3 1 2 2 3 3 1 3 3 3 2 1 1 3 2 1 3 3 3 1 3 3 3 3 1 3 1 2 3 2 3
## [15085] 3 3 3 3 3 2 3 3 1 3 1 2 3 2 3 1 2 2 2 2 2 3 3 2 2 3 2 3 2 3 3 1 3 2 2 1
## [15121] 1 2 2 2 2 3 3 2 3 2 3 1 3 2 3 3 3 3 3 3 3 2 3 3 3 1 2 3 2 2 3 2 2 1 2 2
## [15157] 1 3 2 3 3 3 1 3 3 3 3 3 2 2 1 3 3 2 2 3 2 1 2 2 2 1 2 3 2 3 3 2 3 3 3 3
## [15193] 3 3 1 3 3 3 3 3 3 3 3 3 2 3 1 2 2 3 1 2 3 3 2 3 3 2 3 2 1 3 2 2 2 2 3 2
## [15229] 2 3 2 2 3 2 2 2 2 2 3 3 2 3 3 2 3 3 2 3 1 2 3 1 1 1 3 2 3 3 2 2 3 2 3 3
## [15265] 3 2 1 3 3 3 2 3 2 1 2 1 2 3 2 2 1 1 2 2 3 2 2 3 3 2 2 1 3 3 3 3 2 3 2 2
## [15301] 2 3 1 2 1 3 1 3 2 3 2 1 2 3 3 3 3 3 2 3 3 3 2 3 3 2 1 3 3 2 2 2 2 3 3 2
## [15337] 3 2 3 2 2 2 2 2 2 2 1 2 3 1 3 3 3 3 3 2 3 3 2 2 3 2 3 3 2 2 3 2 2 2 2 3
## [15373] 1 2 3 2 1 3 2 3 2 3 3 3 3 2 2 3 3 3 3 3 2 3 1 3 2 2 1 3 3 3 2 2 3 3 2 2
## [15409] 3 3 1 3 2 2 2 3 3 1 2 3 2 2 3 1 2 3 3 2 2 3 2 2 2 2 2 3 2 2 3 3 1 3 2 1
## [15445] 3 2 3 3 3 2 3 3 3 3 3 3 2 2 3 1 2 2 2 3 2 3 3 3 2 2 3 3 2 3 1 3 3 2 3 3
## [15481] 3 3 2 3 2 2 3 3 2 2 2 2 2 3 3 3 3 3 2 2 2 2 1 3 1 2 2 2 2 2 3 2 2 3 3 3
## [15517] 2 3 1 2 2 3 3 2 3 3 2 3 3 2 2 2 1 2 3 1 1 2 3 1 2 2 2 1 2 2 2 1 3 3 2 3
## [15553] 3 1 3 2 3 3 3 2 3 2 3 2 2 1 1 3 1 3 1 3 2 3 1 2 2 2 2 2 2 2 2 2 3 3 1 2
## [15589] 1 3 2 3 1 3 2 3 3 3 3 3 2 3 1 2 1 1 3 3 3 2 1 2 1 1 2 3 1 2 2 3 3 3 2 3
## [15625] 3 3 3 1 2 3 2 2 2 3 3 2 3 3 2 2 3 1 1 2 3 3 3 1 3 2 2 1 3 3 3 2 2 2 1 1
## [15661] 2 2 2 3 3 3 2 2 1 3 3 2 1 3 3 2 2 1 2 3 2 3 2 2 2 3 3 1 3 3 2 3 2 2 3 2
## [15697] 3 3 3 3 2 1 1 3 2 2 3 2 3 1 2 3 2 2 2 3 2 2 1 3 3 3 2 3 1 2 2 1 3 1 1 2
## [15733] 2 2 2 3 3 3 3 2 2 3 3 3 3 3 2 3 1 1 2 3 3 2 3 2 3 3 3 2 2 3 2 2 1 3 3 1
## [15769] 3 1 3 2 1 3 2 2 2 1 3 2 2 3 2 2 3 3 3 2 2 2 2 2 3 1 2 2 3 3 2 1 3 3 3 3
## [15805] 2 3 3 2 3 2 3 3 2 2 2 2 2 3 3 3 2 3 3 3 1 3 2 2 3 3 3 3 3 2 3 3 2 2 3 2
## [15841] 1 2 3 3 2 2 3 3 1 3 1 2 1 2 3 3 2 2 3 3 2 3 3 1 2 2 2 2 3 2 3 1 1 3 2 3
## [15877] 2 3 3 2 3 2 2 1 2 2 3 2 2 2 2 3 1 2 3 3 3 2 2 3 3 3 3 2 3 3 3 2 3 1 2 2
## [15913] 1 3 1 3 3 2 1 1 3 2 2 2 2 3 2 3 3 2 1 1 3 3 3 2 2 2 2 2 1 1 3 1 2 2 3 3
## [15949] 2 2 2 2 2 3 3 2 2 2 2 3 2 3 2 2 1 2 1 3 1 2 1 2 3 2 2 2 2 2 2 2 3 3 3 1
## [15985] 3 3 1 1 3 2 3 3 2 1 2 3 2 2 2 2 1 3 3 2 3 2 3 3 3 2 2 2 3 1 2 3 3 3 2 1
## [16021] 3 1 1 2 1 2 3 2 2 2 3 3 3 3 2 2 2 3 2 2 2 2 3 3 2 3 3 2 2 3 3 1 2 3 2 2
## [16057] 2 3 2 3 3 3 2 3 2 2 2 3 1 3 2 2 2 1 3 2 2 3 2 3 2 3 3 3 1 2 3 1 2 3 2 2
## [16093] 2 2 3 3 2 1 2 2 2 3 2 1 3 2 2 1 3 2 2 1 3 3 2 2 3 1 3 3 3 2 1 1 3 3 3 3
## [16129] 3 3 2 1 1 2 3 3 1 1 2 2 2 1 3 3 2 3 3 3 3 1 3 2 2 3 2 3 3 3 3 2 3 1 2 2
## [16165] 2 2 3 2 1 2 2 2 2 3 2 2 2 1 3 2 2 3 3 2 2 2 1 2 2 3 1 3 2 3 3 2 3 2 2 2
## [16201] 3 2 1 2 3 2 2 3 1 1 3 3 3 3 2 2 3 2 3 3 2 3 2 2 3 2 3 3 1 2 2 3 3 2 1 1
## [16237] 3 1 2 3 3 2 3 2 3 3 2 3 3 3 3 2 3 3 3 1 1 2 1 3 2 3 2 3 2 3 3 2 3 2 2 2
## [16273] 3 3 3 2 1 3 1 3 2 2 2 3 3 2 1 1 3 2 2 2 3 3 3 2 3 2 2 2 2 3 3 2 2 2 3 2
## [16309] 2 2 1 2 2 3 1 1 3 1 3 2 3 3 2 3 2 2 3 2 3 2 3 1 3 3 3 3 2 3 3 2 3 3 2 1
## [16345] 3 2 1 2 2 2 3 2 3 1 2 3 2 3 2 3 2 3 2 1 1 3 3 2 3 2 3 2 1 3 3 2 3 1 2 2
## [16381] 1 2 2 3 3 3 3 3 1 2 2 3 2 3 3 3 1 3 2 3 2 2 3 2 2 1 1 1 3 2 2 3 2 2 3 3
## [16417] 3 3 1 2 2 3 3 3 1 2 3 1 2 2 2 3 3 1 1 2 2 2 2 3 3 3 2 3 3 2 1 2 2 1 3 1
## [16453] 3 2 2 3 2 2 2 3 3 3 2 2 3 2 1 2 2 2 2 3 3 1 2 1 2 2 3 3 2 2 3 3 2 3 3 3
## [16489] 3 1 3 2 2 2 2 3 3 3 1 2 1 3 1 2 3 2 2 2 1 1 3 3 3 1 2 3 2 2 3 2 3 3 3 3
## [16525] 2 2 2 2 2 3 2 2 3 3 3 3 1 3 3 2 1 3 3 2 1 2 2 3 3 3 2 1 3 3 2 3 3 3 3 2
## [16561] 2 3 3 3 2 2 3 2 3 1 1 3 3 2 2 2 2 3 2 3 3 1 2 2 2 1 1 2 2 2 2 2 2 3 3 2
## [16597] 2 3 2 1 2 3 3 2 2 3 2 3 2 3 2 2 3 1 3 3 3 3 3 3 1 2 1 3 2 1 2 2 1 3 2 1
## [16633] 1 3 2 2 3 2 3 2 3 3 3 3 3 2 2 2 3 2 3 2 3 2 2 2 3 3 2 2 3 2 2 2 2 3 3 1
## [16669] 1 1 3 2 3 2 3 2 2 2 1 1 2 2 2 3 2 2 3 1 2 3 2 3 2 2 3 2 2 2 3 2 3 3 1 3
## [16705] 2 2 2 2 3 2 3 2 1 2 3 1 2 2 2 3 2 3 2 3 2 2 1 1 1 2 3 2 3 3 2 2 2 3 1 2
## [16741] 2 1 3 3 2 3 2 2 2 3 3 1 3 1 3 3 3 2 2 2 2 2 3 2 3 3 2 3 3 2 3 3 1 1 3 3
## [16777] 3 3 1 2 3 2 2 2 3 2 2 2 1 3 2 2 3 3 2 2 2 3 3 1 1 1 2 2 2 3 3 2 2 2 2 2
## [16813] 2 2 3 2 3 2 2 2 2 2 2 2 3 3 3 2 1 1 3 3 2 3 2 2 2 1 2 2 1 2 2 3 2 2 2 1
## [16849] 1 2 3 2 1 3 3 3 3 3 2 3 3 2 3 3 2 1 2 3 2 2 3 3 2 3 2 2 3 3 2 3 3 1 3 2
## [16885] 3 2 2 3 3 2 2 2 3 2 3 1 3 2 3 3 3 3 2 2 3 3 1 3 1 2 2 2 1 2 3 2 2 1 2 2
## [16921] 2 2 3 2 2 3 2 1 3 3 3 2 3 3 2 2 2 3 3 1 3 3 3 2 2 2 2 2 2 1 2 2 3 1 3 2
## [16957] 3 3 3 2 3 3 3 2 3 2 1 3 3 1 2 3 3 2 2 2 3 3 3 2 3 3 1 3 2 3 3 3 3 3 2 2
## [16993] 1 2 2 3 1 2 3 3 1 1 3 2 2 3 3 3 3 2 2 3 2 1 2 1 3 2 2 3 2 3 2 2 2 1 2 2
## [17029] 2 2 3 3 2 2 2 2 3 1 2 2 2 3 1 1 3 3 3 3 3 2 2 2 2 2 2 3 1 2 3 3 3 3 2 3
## [17065] 3 3 3 2 1 2 2 3 2 3 1 2 2 3 3 2 1 3 3 3 3 2 2 2 2 3 3 3 3 2 1 2 2 3 3 1
## [17101] 3 3 1 2 3 3 2 3 2 3 2 3 2 2 3 1 3 2 3 3 2 3 3 1 3 3 2 2 3 2 2 2 1 2 2 1
## [17137] 2 2 2 3 2 3 2 2 1 3 3 1 1 3 3 1 2 2 3 2 3 2 3 2 1 2 3 3 3 1 3 2 3 3 2 3
## [17173] 2 2 2 1 2 3 2 3 3 3 1 3 3 2 3 3 3 1 3 1 3 3 2 3 3 2 2 2 3 3 3 3 3 3 1 3
## [17209] 1 2 3 1 1 2 2 3 2 2 2 3 3 2 2 2 2 2 3 2 1 2 2 2 3 3 2 3 3 2 3 3 1 3 3 2
## [17245] 2 2 2 1 1 3 2 1 3 1 3 2 3 3 2 2 2 2 3 2 1 2 1 3 2 3 3 2 3 2 2 2 3 2 1 2
## [17281] 2 3 2 1 2 2 2 2 2 2 2 3 2 3 2 2 2 3 3 2 2 2 1 3 3 3 3 3 3 2 1 3 3 2 1 3
## [17317] 3 1 1 2 3 2 1 2 2 2 1 3 2 2 3 3 3 2 1 3 2 1 3 2 2 1 1 2 2 3 2 2 3 1 3 3
## [17353] 2 2 2 3 3 3 3 3 1 2 2 3 3 3 2 2 3 2 3 2 1 2 3 1 3 2 3 2 3 2 3 2 1 2 2 2
## [17389] 2 2 3 3 2 2 2 3 2 1 3 1 2 2 3 2 3 2 2 2 2 3 2 3 3 3 3 2 3 2 3 3 3 3 3 2
## [17425] 3 2 3 2 2 3 2 2 3 3 3 1 2 2 2 1 3 3 3 3 3 2 3 2 2 1 2 2 3 2 1 2 3 2 3 3
## [17461] 3 1 2 2 3 3 3 3 2 3 2 2 3 3 1 2 2 2 1 2 3 2 2 2 2 1 2 3 2 2 1 3 2 2 2 1
## [17497] 2 2 3 2 2 3 2 3 1 2 2 3 3 3 3 2 3 3 2 3 1 2 3 1 3 3 1 3 2 3 3 1 3 2 3 1
## [17533] 1 3 3 3 2 3 3 3 3 3 2 3 3 3 1 2 2 3 3 3 3 3 1 3 2 3 2 3 3 2 2 3 2 1 3 2
## [17569] 1 3 2 2 1 2 2 3 3 3 2 2 1 2 3 1 3 3 2 3 3 3 2 3 3 3 3 2 3 3 3 3 3 2 1 3
## [17605] 2 2 2 2 3 1 3 3 3 1 2 3 3 2 3 3 2 2 3 3 2 2 2 1 1 3 3 1 2 2 1 1 3 2 3 1
## [17641] 1 2 2 3 2 2 2 3 1 3 3 1 1 2 3 2 3 3 1 2 2 2 2 2 2 3 2 3 2 2 2 2 2 2 3 3
## [17677] 2 3 2 1 3 2 3 3 3 2 1 3 1 2 2 2 2 2 3 3 1 3 2 2 3 2 3 3 2 2 3 3 3 3 3 2
## [17713] 3 2 3 3 1 2 1 1 3 2 3 1 2 3 2 2 3 2 1 3 3 2 1 3 2 1 3 3 3 1 2 2 2 2 1 3
## [17749] 2 3 3 3 2 2 1 3 3 2 3 3 2 3 3 2 2 3 3 3 2 3 2 2 3 3 3 3 1 2 2 3 2 3 1 2
## [17785] 3 2 1 1 2 2 1 3 3 3 2 3 2 3 2 1 2 3 3 1 2 2 2 3 3 1 3 2 3 2 2 3 2 3 2 3
## [17821] 3 2 2 3 2 2 2 3 3 1 2 2 2 3 2 3 2 1 2 2 2 2 3 2 1 2 2 2 3 2 2 1 2 2 3 3
## [17857] 3 3 3 2 2 3 1 3 1 3 3 3 3 2 3 3 2 2 2 2 3 3 3 3 3 3 2 2 1 3 3 2 3 2 3 3
## [17893] 2 3 3 3 3 2 2 3 1 1 2 3 3 3 3 2 2 3 1 2 2 3 1 1 2 1 2 1 3 3 2 2 2 3 1 2
## [17929] 3 3 3 1 2 2 1 3 2 2 3 3 3 3 2 2 2 2 3 2 3 2 3 3 1 2 2 3 2 2 2 2 2 2 2 2
## [17965] 2 2 1 3 3 3 2 2 2 2 3 2 3 3 2 2 2 2 1 2 3 2 3 3 3 2 3 1 2 3 3 2 1 1 1 3
## [18001] 2 1 1 3 3 1 2 3 3 2 2 3 2 2 2 3 3 1 1 3 2 2 2 3 2 3 2 2 3 1 2 3 2 1 3 2
## [18037] 1 2 2 2 2 2 3 3 2 3 2 1 2 2 1 3 3 3 3 2 3 2 2 2 2 3 1 2 3 3 2 3 3 1 3 2
## [18073] 2 3 2 3 3 2 3 3 3 3 3 2 3 2 2 1 2 3 2 2 1 3 2 2 3 3 2 3 2 3 3 2 2 3 2 2
## [18109] 3 1 3 3 2 2 2 3 3 3 3 2 3 2 3 2 3 2 2 3 2 3 2 2 3 2 3 2 3 1 2 2 1 2 2 3
## [18145] 2 2 2 2 2 1 2 2 3 2 3 3 3 1 3 3 1 2 2 3 2 1 2 2 1 2 3 2 2 2 2 3 3 2 3 2
## [18181] 3 2 3 3 3 3 2 1 3 2 3 3 1 3 2 2 2 3 2 3 3 2 2 2 2 3 3 1 2 2 2 2 1 1 2 3
## [18217] 3 3 1 3 2 2 2 1 3 3 3 3 3 2 2 2 1 3 2 2 3 3 2 1 2 3 2 2 2 3 2 2 2 2 3 2
## [18253] 3 2 3 2 2 1 3 2 3 3 2 2 2 2 1 1 1 3 1 2 3 2 3 2 2 2 3 2 3 3 2 1 3 2 3 3
## [18289] 3 2 2 1 3 3 3 2 3 2 3 3 3 2 1 3 3 1 1 3 3 2 2 2 2 2 2 2 1 1 3 2 2 1 1 3
## [18325] 3 2 3 3 3 3 2 3 1 1 1 3 3 3 1 1 2 2 2 3 3 3 3 2 1 2 2 3 3 2 2 2 3 3 3 1
## [18361] 2 3 2 2 2 2 3 3 3 3 3 1 3 2 2 3 1 2 2 2 3 1 2 1 3 1 2 1 2 3 2 3 3 1 2 2
## [18397] 3 3 2 3 2 2 3 2 3 3 1 2 2 1 1 2 3 1 2 3 1 3 2 2 3 2 2 2 1 3 2 3 2 3 3 2
## [18433] 2 2 3 3 3 1 2 2 2 2 2 1 2 3 2 3 2 3 1 2 3 2 2 2 1 3 2 3 1 2 3 3 2 3 2 2
## [18469] 2 2 3 3 2 1 2 2 3 3 3 3 2 2 3 3 2 3 2 3 2 3 2 2 3 3 3 2 3 3 1 1 1 3 3 3
## [18505] 3 2 2 2 2 2 2 2 2 3 2 3 2 1 3 1 2 2 1 2 1 2 1 3 3 3 3 3 2 2 2 3 2 2 2 2
## [18541] 3 1 1 3 1 3 2 3 3 3 2 1 3 2 1 2 2 2 2 3 3 3 3 3 1 2 3 3 2 3 3 1 2 2 1 1
## [18577] 1 3 2 2 2 3 2 3 2 3 2 2 3 3 2 3 2 1 1 3 3 2 2 2 3 2 2 2 3 1 1 3 3 3 1 3
## [18613] 2 2 2 1 2 3 3 3 2 2 3 3 3 1 3 3 3 3 3 2 3 2 1 3 2 2 3 3 3 1 2 2 3 1 3 2
## [18649] 1 3 3 1 2 3 2 2 3 1 1 2 3 2 2 2 2 1 2 3 2 3 2 1 1 2 1 2 2 3 3 2 3 3 3 2
## [18685] 3 2 2 3 3 2 3 3 2 3 2 2 3 2 2 3 2 2 2 1 2 2 3 3 3 3 2 2 1 3 1 3 3 2 3 3
## [18721] 2 3 2 2 3 2 2 3 3 3 3 2 3 3 3 2 3 3 3 2 3 2 2 2 2 2 2 3 3 2 3 2 2 3 2 3
## [18757] 2 2 2 3 1 2 3 3 3 3 3 3 2 2 2 1 2 1 3 3 1 3 2 1 1 2 1 2 2 3 2 3 1 3 3 3
## [18793] 3 1 2 2 3 2 3 3 3 1 2 3 3 3 1 3 3 3 1 3 2 2 3 3 1 1 2 2 1 1 2 3 3 3 2 3
## [18829] 1 2 1 2 3 3 2 1 3 3 2 2 3 1 3 3 2 3 2 3 2 1 2 2 2 3 2 3 3 2 2 3 2 2 3 3
## [18865] 3 2 2 3 3 2 2 3 3 3 3 2 2 3 3 2 1 2 3 2 1 2 3 2 3 2 3 2 3 2 3 1 2 3 3 2
## [18901] 2 3 3 3 2 2 3 3 2 3 1 3 3 2 3 3 3 3 2 2 3 3 2 2 2 3 2 1 3 3 3 3 2 2 1 2
## [18937] 2 2 2 3 2 3 3 2 2 2 2 2 2 3 2 1 2 3 2 2 3 2 2 3 1 3 2 3 3 2 3 1 2 3 2 1
## [18973] 3 2 2 3 3 1 2 2 3 2 3 2 2 2 2 3 3 2 3 3 1 3 2 3 3 2 3 1 2 1 2 2 3 2 3 3
## [19009] 2 2 2 2 3 3 2 3 2 3 2 3 1 1 1 1 3 1 2 2 3 1 3 3 3 1 2 3 3 3 2 2 1 2 1 2
## [19045] 2 2 3 2 3 2 1 3 3 2 2 1 2 2 1 2 2 2 2 3 3 1 2 3 2 3 2 3 3 2 2 2 3 2 2 2
## [19081] 1 2 3 3 3 2 3 2 2 3 3 3 2 3 3 3 2 3 3 1 1 3 2 2 3 3 1 3 2 1 1 2 2 2 3 3
## [19117] 2 2 2 1 2 2 3 1 2 2 3 3 2 1 3 2 2 2 2 1 3 2 3 3 3 2 2 1 2 2 3 3 2 2 1 1
## [19153] 2 3 3 2 3 3 2 3 1 2 3 3 1 3 3 2 3 2 2 2 3 2 3 2 3 3 2 2 3 3 1 2 3 3 2 3
## [19189] 2 2 3 3 1 2 1 3 2 2 2 3 3 3 3 2 3 3 2 3 3 3 2 2 2 2 2 2 2 3 3 1 3 2 3 2
## [19225] 3 2 3 1 2 3 2 3 2 2 2 2 2 3 2 3 2 3 3 1 2 1 2 3 3 3 2 2 2 2 2 3 1 2 1 1
## [19261] 3 2 3 2 2 3 2 2 2 3 2 3 3 3 2 1 3 1 3 2 3 1 2 2 3 3 3 2 2 3 3 2 3 2 3 3
## [19297] 3 1 3 2 1 1 3 1 3 2 2 2 3 2 1 3 2 2 3 3 2 3 3 1 2 3 1 1 2 2 2 3 2 2 3 2
## [19333] 3 1 3 2 2 2 2 2 2 2 3 1 3 2 1 2 3 1 1 2 2 2 2 2 1 2 3 3 2 1 3 1 3 3 1 3
## [19369] 3 3 3 3 1 2 3 2 1 3 1 2 3 2 2 3 2 2 3 2 2 2 2 3 2 3 3 2 3 2 2 3 2 1 3 2
## [19405] 3 2 2 3 3 3 2 3 2 3 3 3 2 3 3 3 3 2 2 1 3 2 3 3 3 2 2 1 1 2 2 3 2 2 2 1
## [19441] 2 1 1 2 2 2 3 3 1 1 2 2 3 3 2 2 2 1 3 3 3 2 3 3 3 2 3 3 3 2 2 2 2 1 3 2
## [19477] 2 2 2 2 2 1 3 2 2 3 3 2 3 1 2 3 3 3 3 2 1 1 3 1 3 3 2 2 2 3 2 2 3 3 2 3
## [19513] 2 2 2 1 3 2 3 2 2 3 3 3 3 2 3 2 3 2 3 1 2 2 2 1 3 2 2 3 2 3 3 2 2 2 3 3
## [19549] 2 2 2 2 3 3 3 2 3 2 3 2 3 3 3 3 2 3 1 2 2 3 2 2 3 3 3 3 3 3 1 3 3 3 3 2
## [19585] 3 2 3 2 2 2 2 1 1 2 2 2 3 3 1 2 2 2 2 3 3 3 1 3 3 3 2 3 2 2 3 3 2 2 2 2
## [19621] 2 3 2 2 2 2 2 2 3 1 3 3 3 3 2 3 2 2 1 2 2 1 2 1 3 3 3 2 2 3 1 3 2 3 1 2
## [19657] 1 2 2 3 3 2 3 2 3 2 3 3 3 3 2 3 3 2 1 2 1 2 2 2 2 2 3 3 1 3 2 3 2 2 1 2
## [19693] 2 3 2 1 3 2 2 3 3 3 2 3 2 2 2 3 2 2 1 2 2 1 1 2 2 3 2 3 2 3 2 2 3 3 2 3
## [19729] 2 2 3 2 3 2 1 2 3 2 3 2 2 3 1 3 2 3 2 3 2 3 3 2 2 3 1 2 2 2 3 3 2 1 2 3
## [19765] 2 2 2 1 3 2 3 3 3 2 2 2 3 2 2 2 3 3 2 2 3 1 2 2 2 2 1 3 3 2 3 2 3 3 3 2
## [19801] 2 1 1 3 1 2 3 2 3 3 3 2 3 2 3 2 2 3 3 1 2 3 2 1 2 3 2 3 1 3 2 1 3 2 2 3
## [19837] 1 3 2 2 3 2 1 2 2 2 1 2 3 3 1 3 3 2 2 2 3 3 3 2 1 3 3 3 3 1 3 2 2 2 2 3
## [19873] 1 1 3 2 2 2 3 3 2 2 2 3 1 2 2 3 3 3 1 3 3 2 2 1 1 2 2 1 3 2 3 3 1 2 2 3
## [19909] 1 2 3 1 2 2 2 2 2 2 1 2 1 3 1 3 3 3 2 2 2 2 2 2 1 2 2 3 2 2 3 2 3 3 3 3
## [19945] 2 2 3 3 1 3 2 2 1 3 3 2 2 3 2 1 3 1 1 2 3 2 2 3 2 2 2 2 3 3 2 2 2 3 3 3
## [19981] 3 2 3 3 3 3 3 3 2 2 1 3 3 3 2 3 2 2 3 2 2 2 3 1 1 1 3 2 2 2 2 3 2 2 2 1
## [20017] 3 3 2 2 3 2 2 2 1 2 2 2 3 3 2 1 2 1 2 2 3 3 2 3 3 3 2 3 2 2 3 2 3 2 2 2
## [20053] 2 3 3 3 2 3 3 1 2 3 2 3 2 2 2 3 2 2 3 3 3 1 3 3 2 1 2 2 1 2 3 3 2 1 2 2
## [20089] 2 2 2 3 2 3 1 3 2 3 3 2 2 2 3 3 3 3 1 2 3 1 3 2 3 1 2 3 3 3 1 2 3 2 1 3
## [20125] 3 2 3 3 2 2 3 3 2 3 1 3 3 2 2 2 3 3 2 2 3 3 3 1 2 2 1 2 2 2 3 2 3 2 2 2
## [20161] 1 3 2 1 1 2 3 2 3 3 2 2 2 2 1 2 3 2 2 3 3 3 2 1 2 2 2 2 2 2 3 2 3 2 2 2
## [20197] 2 2 2 2 3 2 2 2 2 2 2 2 1 3 3 3 2 3 2 3 1 3 2 3 2 3 2 3 2 3 2 2 2 3 2 3
## [20233] 2 2 1 2 3 1 3 3 3 2 3 3 3 3 3 3 2 3 2 2 2 3 3 2 3 2 2 3 2 3 2 2 2 3 2 2
## [20269] 2 2 1 2 1 3 1 3 2 1 3 2 2 2 2 2 2 3 3 3 2 3 2 3 3 2 2 3 3 1 2 2 3 2 2 1
## [20305] 3 2 3 2 2 3 2 3 2 3 1 2 2 2 3 3 1 2 2 1 1 3 2 2 3 1 3 3 2 3 1 1 2 1 2 3
## [20341] 1 3 3 2 3 3 2 1 3 3 3 3 2 3 2 3 2 3 3 2 3 3 2 1 3 2 3 3 2 3 3 2 3 2 2 2
## [20377] 1 2 1 3 1 1 2 2 3 3 3 2 2 3 3 2 2 3 3 2 2 1 2 3 2 1 3 2 2 2 3 2 3 2 2 1
## [20413] 1 1 1 2 2 2 3 2 2 2 3 2 3 2 3 2 3 2 3 3 2 2 2 2 3 3 2 3 1 2 3 3 3 2 1 3
## [20449] 3 2 3 2 2 2 3 2 2 2 2 2 2 2 3 2 2 1 1 3 3 3 3 1 2 2 2 2 2 3 3 3 2 1 1 2
## [20485] 3 3 3 3 2 2 2 2 2 1 3 1 3 2 2 3 2 2 3 2 3 1 1 2 3 1 2 2 1 2 2 2 2 3 3 3
## [20521] 2 2 2 2 2 2 3 2 3 2 2 1 2 2 3 3 3 2 2 2 1 1 2 3 2 3 3 2 2 3 2 2 3 2 2 3
## [20557] 3 3 2 3 2 2 3 3 1 3 3 2 1 2 2 3 2 2 1 2 3 2 3 2 2 2 3 1 2 2 3 2 2 2 3 3
## [20593] 1 1 3 2 3 3 1 3 2 2 2 2 2 2 3 1 2 2 3 3 3 3 3 2 3 2 1 1 2 2 2 2 3 3 1 3
## [20629] 2 2 2 3 3 1 3 3 3 2 1 3 3 2 3 3 3 2 3 2 2 3 3 3 2 2 3 2 2 2 3 3 2 2 2 3
## [20665] 2 3 2 3 3 3 2 3 3 2 1 3 2 3 2 2 3 2 2 2 3 2 1 3 3 3 3 1 3 2 3 3 2 3 3 3
## [20701] 3 3 3 3 2 2 1 2 2 1 1 3 2 2 2 1 2 1 1 2 3 1 2 3 3 1 2 2 3 2 3 3 1 3 2 3
## [20737] 3 3 1 3 2 3 3 3 3 3 3 1 2 1 2 1 1 3 2 3 2 2 3 3 3 3 3 3 3 3 2 2 1 3 3 3
## [20773] 1 3 2 1 3 1 3 3 2 3 2 3 1 2 1 3 3 3 2 3 3 1 3 3 1 3 3 2 2 2 3 2 2 3 2 3
## [20809] 2 3 2 3 2 2 2 2 3 2 3 3 2 2 2 3 3 2 2 3 3 3 3 2 3 3 1 3 2 3 2 2 2 2 3 2
## [20845] 1 1 2 2 1 2 1 2 2 3 3 3 2 1 2 3 3 3 3 1 2 3 3 3 2 2 2 3 2 2 3 2 2 2 2 1
## [20881] 3 1 3 2 3 3 3 3 3 1 3 2 3 1 3 1 2 1 1 1 3 2 2 3 2 2 3 2 2 2 3 1 2 2 2 3
## [20917] 2 2 3 1 3 3 3 3 1 2 3 2 3 3 3 2 3 3 2 2 3 3 2 2 2 2 2 2 2 2 3 2 2 3 3 1
## [20953] 1 3 3 1 3 1 2 3 1 1 2 1 2 2 3 2 3 2 1 2 2 1 3 3 1 3 2 2 2 2 3 2 2 3 3 1
## [20989] 3 2 2 2 3 3 3 1 3 3 3 1 1 1 2 3 2 2 2 3 3 2 3 2 2 2 2 2 2 2 2 2 2 1 3 1
## [21025] 2 2 1 2 3 3 2 2 3 3 2 3 3 2 2 3 3 3 2 3 2 1 2 3 3 2 3 2 2 1 1 3 2 2 2 3
## [21061] 2 3 2 3 2 2 3 2 3 2 2 3 3 3 2 1 1 3 3 2 3 2 3 2 2 2 2 2 1 2 3 2 3 2 3 3
## [21097] 1 1 2 3 3 1 2 2 3 2 3 1 2 3 3 2 2 2 2 2 2 3 3 3 3 2 2 1 2 2 3 2 2 3 3 2
## [21133] 1 2 3 2 3 2 2 3 2 3 3 1 3 2 3 3 2 1 3 3 1 3 2 1 3 2 2 2 3 3 3 3 2 2 3 1
## [21169] 2 3 2 3 2 2 2 1 2 2 2 2 2 3 2 3 3 3 3 2 2 1 3 2 3 2 1 2 3 2 3 2 2 3 3 2
## [21205] 2 2 3 2 2 3 2 3 3 2 3 2 2 2 2 2 3 1 2 1 2 1 3 2 2 2 3 1 2 2 2 2 2 3 2 2
## [21241] 2 2 2 3 3 2 3 2 2 2 3 3 3 3 3 3 2 1 2 1 2 2 2 3 2 2 2 3 2 3 2 3 3 3 1 3
## [21277] 3 3 2 2 2 3 2 3 1 3 1 2 2 3 2 3 2 2 3 2 1 3 3 2 3 3 2 3 3 3 1 3 3 3 3 2
## [21313] 2 1 2 3 1 3 2 3 3 3 3 2 3 2 1 2 2 2 3 2 3 2 3 2 1 2 3 3 2 3 3 3 1 2 3 1
## [21349] 2 3 3 3 3 2 2 1 2 1 3 3 3 3 3 2 3 2 1 2 2 2 2 3 2 1 2 2 1 1 2 2 3 1 3 2
## [21385] 2 3 3 1 3 2 2 2 2 3 3 2 2 3 2 3 1 1 1 3 1 1 3 2 2 3 3 1 2 2 2 2 3 2 3 2
## [21421] 2 3 1 1 2 3 1 3 1 2 2 3 1 2 3 3 2 2 2 2 3 1 3 2 1 2 3 2 1 2 3 1 1 3 3 1
## [21457] 3 1 2 2 1 2 2 2 2 3 3 2 3 2 2 3 2 2 1 2 3 2 2 2 2 3 3 3 3 3 2 3 3 2 3 2
## [21493] 2 3 3 2 2 1 2 3 2 3 2 2 3 2 3 3 2 3 2 2 3 3 2 1 2 3 2 1 2 2 2 3 2 3 2 3
## [21529] 2 3 3 3 3 3 2 2 2 2 2 2 2 1 2 3 3 2 2 2 3 2 2 1 3 1 3 3 2 2 1 3 2 2 2 2
## [21565] 2 2 1 2 3 3 1 2 1 1 2 2 3 3 3 2 1 2 3 3 3 3 2 2 3 1 2 3 3 2 3 3 3 2 2 1
## [21601] 3 3 2 2 2 1 2 3 1 2 2 3 2 3 1 3 2 3 3 2 1 2 3 3 3 2 1 2 2 2 3 2 2 2 3 3
## [21637] 1 2 1 3 3 3 2 1 3 1 3 3 2 1 2 2 3 2 3 1 2 2 2 2 2 2 3 1 2 1 2 3 3 1 2 1
## [21673] 2 1 2 3 2 2 3 2 3 2 2 1 3 3 3 2 1 3 3 1 2 2 3 3 2 1 3 3 2 2 2 3 3 1 3 2
## [21709] 2 2 2 2 3 1 2 1 2 3 2 1 3 3 1 3 3 3 3 3 2 2 2 2 3 2 1 1 2 2 1 2 2 2 2 2
## [21745] 2 2 2 2 3 3 2 2 2 3 3 3 3 1 3 3 2 3 2 2 2 2 2 2 2 2 1 1 2 2 2 1 3 3 3 3
## [21781] 2 2 3 2 2 3 3 3 2 3 2 2 2 3 3 1 2 3 2 2 1 2 2 3 2 3 2 1 3 2 3 3 3 1 3 3
## [21817] 2 3 2 3 3 3 3 3 2 3 2 2 3 1 3 3 2 2 1 2 3 2 2 2 3 2 2 1 2 3 3 1 1 3 1 3
## [21853] 3 3 2 3 2 1 3 1 3 3 1 1 2 3 2 2 3 1 2 1 3 3 3 3 2 3 1 3 2 3 1 3 2 1 2 1
## [21889] 2 2 2 2 3 3 3 2 2 3 2 2 3 3 3 3 2 1 1 2 3 2 1 3 2 2 2 2 3 2 3 3 2 2 2 2
## [21925] 3 2 3 2 1 1 3 1 3 3 2 3 3 2 1 1 2 2 3 1 2 3 2 3 3 3 3 2 1 2 3 3 2 3 2 2
## [21961] 2 3 2 3 2 3 2 2 2 3 3 2 2 2 2 3 2 2 3 3 2 2 2 2 3 2 3 2 2 3 2 2 1 3 2 3
## [21997] 2 2 2 3 2 3 2 2 3 3 2 3 3 3 3 1 1 2 1 3 2 3 3 1 3 2 1 3 3 2 2 2 2 1 2 1
## [22033] 1 1 2 3 1 3 1 3 3 3 2 2 2 2 3 3 2 3 1 3 3 3 3 2 2 1 3 1 2 3 2 3 3 2 2 2
## [22069] 3 3 2 2 2 3 2 1 3 2 2 2 3 3 3 2 1 2 1 2 2 2 2 3 3 3 2 1 3 2 3 2 2 2 2 3
## [22105] 3 3 3 1 3 2 3 2 1 3 1 3 3 2 3 3 2 3 2 3 1 3 1 2 1 3 2 3 3 3 2 1 2 2 2 3
## [22141] 2 2 2 3 3 2 3 1 2 3 3 2 1 3 2 3 2 2 1 1 2 2 3 2 2 3 2 1 3 3 2 2 2 2 2 3
## [22177] 3 3 2 2 1 3 1 3 1 2 2 3 3 1 2 3 2 2 2 3 1 3 3 3 1 2 3 3 2 3 3 2 1 3 3 2
## [22213] 3 2 2 2 2 3 3 3 3 3 1 3 2 2 3 3 3 1 3 3 2 3 2 3 3 3 1 3 3 2 2 3 2 3 1 1
## [22249] 2 3 3 3 3 2 2 2 3 2 1 2 1 3 3 1 3 2 3 2 3 1 3 3 3 3 1 2 1 2 3 2 1 3 1 3
## [22285] 1 3 3 3 3 3 3 1 2 1 2 3 2 3 2 2 2 3 1 2 3 2 3 3 2 3 3 2 2 3 2 3 3 2 3 2
## [22321] 3 2 3 2 2 2 2 2 3 2 2 3 2 2 3 1 3 1 2 1 1 3 2 3 3 2 1 2 3 1 2 3 3 2 3 3
## [22357] 2 2 2 3 3 3 3 3 2 3 2 1 2 2 3 2 1 2 2 3 2 2 2 3 1 2 2 2 3 3 3 2 3 1 3 2
## [22393] 3 3 3 3 2 2 2 3 3 2 2 2 3 2 1 1 1 2 2 2 2 2 3 3 2 3 2 3 2 2 3 2 2 3 1 2
## [22429] 3 2 3 2 2 2 2 2 3 2 1 3 2 2 2 3 1 2 3 3 1 2 3 3 3 3 1 2 1 3 2 2 3 3 2 3
## [22465] 2 3 3 2 1 2 3 2 3 2 3 2 2 2 2 2 2 1 2 3 1 2 2 3 3 2 1 2 1 3 2 2 2 1 3 2
## [22501] 3 2 3 3 2 3 1 3 3 3 3 3 2 1 2 3 2 2 2 3 2 1 2 2 3 3 3 1 2 2 2 1 2 1 2 2
## [22537] 3 1 2 1 3 2 3 2 2 2 2 3 2 3 2 2 3 1 3 2 2 2 2 2 3 3 2 3 2 1 2 3 3 3 3 2
## [22573] 1 1 3 3 2 3 2 2 2 3 3 2 3 3 3 3 3 3 2 2 2 2 2 3 3 3 2 2 2 2 2 3 3 2 3 3
## [22609] 1 3 1 2 3 3 2 2 3 2 2 3 2 3 3 3 1 2 2 2 1 3 3 3 3 3 3 2 3 2 2 3 3 3 1 2
## [22645] 2 2 3 2 3 3 3 3 2 3 1 2 2 1 3 3 2 2 1 2 3 2 2 1 3 3 2 2 3 2 2 3 3 2 2 2
## [22681] 1 2 2 2 2 2 3 3 2 3 2 1 3 2 2 1 1 3 3 3 2 3 3 2 2 3 2 2 3 3 2 3 1 1 1 2
## [22717] 3 2 3 1 3 2 1 3 2 2 3 2 3 2 3 1 2 3 3 2 2 1 3 2 2 2 2 3 2 3 2 3 2 3 2 3
## [22753] 3 1 3 2 3 1 2 3 3 2 1 2 3 2 3 2 2 3 2 3 3 2 3 3 1 3 3 3 3 1 3 2 1 3 2 2
## [22789] 3 2 2 3 1 3 2 1 2 1 3 2 3 1 2 3 1 3 2 2 1 3 2 3 2 1 3 3 2 2 3 2 3 1 2 2
## [22825] 3 3 1 3 2 2 2 2 3 2 3 3 2 3 3 2 2 3 2 1 2 1 2 2 2 2 2 1 3 3 2 3 3 1 2 3
## [22861] 2 2 3 3 3 3 3 1 1 3 1 2 2 2 2 2 2 1 3 2 3 2 3 2 2 3 2 2 2 3 3 2 2 3 2 2
## [22897] 3 2 3 1 2 3 1 1 3 2 2 3 1 2 3 2 2 3 1 3 2 1 3 3 2 2 1 3 3 2 3 2 2 2 2 3
## [22933] 2 2 3 2 3 3 2 2 3 2 3 1 2 3 2 1 3 1 1 2 2 3 2 3 2 2 3 3 2 3 2 3 2 2 1 3
## [22969] 3 3 1 2 2 2 2 3 3 2 3 3 2 2 3 2 2 2 3 2 3 3 2 3 2 3 3 2 2 3 3 2 2 3 2 2
## [23005] 2 3 3 3 3 2 2 1 2 3 3 1 3 3 1 1 2 2 2 2 2 2 2 3 1 3 2 3 3 1 2 3 3 2 3 3
## [23041] 1 2 2 2 1 2 3 2 3 2 3 2 2 2 2 2 2 3 3 3 1 3 2 2 3 2 3 3 2 2 3 2 3 3 3 3
## [23077] 3 1 2 1 3 3 2 2 2 3 3 3 3 3 2 2 2 3 3 2 3 3 2 2 3 1 3 2 3 2 3 2 2 2 3 3
## [23113] 3 2 1 2 3 3 3 1 1 2 1 1 3 3 2 3 3 1 2 2 3 3 1 3 1 2 1 2 1 2 2 1 2 1 2 2
## [23149] 2 2 3 3 3 2 2 2 2 1 3 2 3 3 2 3 2 3 3 2 2 2 3 1 3 2 3 2 2 2 3 3 3 2 3 2
## [23185] 2 3 3 1 2 2 2 2 2 2 3 2 2 3 3 2 3 3 3 3 3 2 3 3 2 2 3 3 1 2 1 1 3 2 2 2
## [23221] 3 3 2 3 3 3 2 3 3 2 2 3 1 3 2 3 2 2 3 3 3 3 2 2 2 3 2 2 2 2 2 3 2 3 3 2
## [23257] 2 2 2 2 1 3 2 2 3 2 3 3 2 2 3 3 1 1 2 3 2 1 2 2 2 3 2 3 3 3 2 3 2 3 2 3
## [23293] 2 1 3 2 2 3 3 2 2 3 2 2 3 3 2 2 2 2 3 2 2 2 2 3 2 1 3 2 3 3 2 1 3 3 1 3
## [23329] 1 2 3 3 3 3 2 2 3 3 2 3 1 2 2 3 3 3 1 2 3 1 2 2 1 3 2 3 3 3 3 3 2 3 3 1
## [23365] 3 3 2 2 3 3 1 3 3 3 3 2 2 3 2 2 1 3 2 2 3 2 3 2 1 3 1 3 1 2 2 3 2 2 3 3
## [23401] 3 1 2 2 2 3 3 2 2 3 2 1 1 2 2 3 1 1 1 1 2 3 2 3 2 3 3 1 2 2 1 2 3 3 2 3
## [23437] 3 2 2 3 2 2 2 2 2 2 3 2 3 2 3 2 2 2 3 2 2 2 3 3 2 3 3 2 2 2 3 2 1 2 2 1
## [23473] 2 2 3 2 2 3 3 3 2 3 2 2 2 2 2 2 1 2 3 2 1 1 3 2 3 2 2 2 3 3 3 3 2 1 2 2
## [23509] 2 2 2 2 2 1 3 3 2 3 3 2 2 2 1 1 3 3 2 2 2 2 2 2 2 1 1 2 2 2 2 3 2 3 3 2
## [23545] 3 2 2 1 2 3 2 1 2 2 2 3 2 3 3 2 2 1 2 2 3 2 1 2 3 2 2 3 1 3 2 3 3 3 2 3
## [23581] 3 1 2 2 1 1 2 2 3 2 1 2 2 3 2 3 1 1 1 2 2 2 3 3 1 2 2 3 2 3 2 1 3 3 2 3
## [23617] 1 3 2 3 1 3 3 2 2 2 3 2 2 2 2 3 3 3 3 3 3 2 3 1 3 3 2 2 3 1 3 3 3 2 3 2
## [23653] 3 2 3 1 2 2 2 1 3 1 3 3 2 3 3 2 3 2 2 2 2 2 3 2 2 2 1 2 3 2 3 2 1 3 3 1
## [23689] 2 3 2 3 3 1 3 3 3 3 3 2 1 3 1 2 2 2 3 2 2 2 3 3 1 2 3 2 3 3 3 2 2 3 2 3
## [23725] 2 3 3 3 3 2 3 2 3 3 3 1 2 3 1 2 2 2 2 3 2 1 2 2 3 2 3 1 3 3 3 2 2 3 2 3
## [23761] 3 1 3 3 3 1 2 2 1 1 1 3 2 3 3 2 3 2 3 3 2 2 1 2 2 2 3 3 3 3 2 2 3 3 3 3
## [23797] 2 3 3 3 1 3 2 2 1 3 1 3 3 2 3 1 2 1 3 1 3 2 3 2 2 1 3 3 3 2 2 3 3 3 2 3
## [23833] 3 3 2 3 1 3 3 2 3 3 3 2 2 1 2 3 2 3 3 1 2 3 2 3 3 1 2 3 3 3 2 3 2 3 2 2
## [23869] 3 2 3 3 2 3 2 2 3 3 2 2 2 1 2 2 2 2 3 1 2 2 2 1 3 3 2 2 3 3 2 2 3 3 2 3
## [23905] 3 2 3 2 3 3 2 2 3 1 3 2 2 2 2 2 2 3 2 2 1 3 1 3 2 2 2 1 3 3 3 2 3 3 2 2
## [23941] 2 1 1 2 3 1 2 1 3 2 2 2 1 3 3 2 1 1 3 2 3 1 3 3 3 2 2 3 3 3 2 2 2 3 2 3
## [23977] 2 3 1 3 1 3 2 3 2 2 2 3 2 1 2 1 2 2 1 2 3 2 3 1 2 3 1 2 3 2 3 3 1 2 3 3
## [24013] 1 2 2 3 3 2 2 3 3 1 3 2 3 1 1 3 2 2 2 3 2 2 1 3 3 3 2 2 2 3 3 2 3 2 3 2
## [24049] 3 2 2 3 2 2 2 3 3 1 3 2 2 3 3 3 2 3 2 3 1 1 3 1 3 2 3 1 2 2 1 3 3 3 3 3
## [24085] 2 1 2 2 3 2 3 2 3 2 3 1 2 1 3 2 3 2 3 3 2 2 3 2 2 2 2 3 2 1 3 2 2 1 2 2
## [24121] 2 3 2 3 3 2 3 2 3 3 2 2 1 2 3 2 2 3 2 1 2 2 3 2 3 2 3 2 2 2 2 2 3 2 1 3
## [24157] 3 2 3 2 3 2 1 2 2 3 3 2 3 1 2 2 1 3 2 2 2 3 1 3 3 3 2 3 3 3 2 3 2 2 2 3
## [24193] 1 2 3 3 3 2 3 2 2 1 3 3 2 1 1 2 2 3 2 3 2 3 2 1 3 2 2 3 3 2 2 1 2 2 3 2
## [24229] 2 2 2 2 2 3 3 3 1 2 2 2 3 2 2 3 2 3 2 1 2 3 3 2 2 2 3 3 3 3 2 2 3 3 3 1
## [24265] 3 3 1 3 3 2 3 1 2 2 2 2 2 2 1 1 2 3 3 1 3 2 3 2 2 2 3 2 2 1 3 2 2 1 3 2
## [24301] 1 2 3 3 2 3 2 2 2 2 3 2 2 2 1 2 3 3 3 3 1 2 3 3 3 2 3 3 2 3 1 3 3 3 1 2
## [24337] 2 3 2 3 3 1 1 2 3 2 2 2 2 2 2 3 3 3 3 3 2 3 2 2 2 3 2 3 3 2 2 2 2 3 2 3
## [24373] 3 2 3 3 3 2 3 3 1 1 2 2 2 1 2 2 2 2 3 3 2 2 2 3 2 2 3 3 3 3 2 3 3 2 2 2
## [24409] 3 2 3 2 3 3 3 2 3 2 3 2 3 2 2 2 1 3 2 1 3 2 3 1 2 2 2 2 2 3 2 3 2 3 1 2
## [24445] 2 2 3 3 3 1 2 1 1 2 2 3 2 1 1 2 3 3 2 2 2 3 1 2 3 3 1 2 2 3 2 3 2 3 1 1
## [24481] 3 3 3 2 2 3 1 3 3 2 3 2 3 3 2 2 3 3 2 2 3 2 3 3 2 2 3 3 3 2 3 3 3 2 3 3
## [24517] 3 2 3 3 2 2 2 3 3 1 1 2 2 1 3 3 1 3 3 2 2 2 3 3 2 2 3 1 3 2 1 1 3 1 3 2
## [24553] 3 2 1 3 2 2 1 3 2 3 3 3 3 2 2 2 3 2 3 2 1 2 2 3 3 2 3 3 3 3 1 2 2 3 3 2
## [24589] 1 3 2 2 1 3 3 3 1 2 3 3 2 1 3 2 1 3 1 3 1 1 3 1 2 3 2 3 3 1 2 3 2 3 3 1
## [24625] 2 2 3 3 3 2 2 3 2 2 2 3 2 2 3 3 2 3 3 3 2 3 2 1 3 2 3 2 3 3 3 2 3 3 2 2
## [24661] 2 3 2 2 2 2 1 3 1 2 3 3 3 1 2 2 2 3 2 3 3 2 1 2 2 2 3 3 2 3 2 3 2 1 3 1
## [24697] 1 1 3 3 2 1 3 1 2 2 1 2 2 1 2 2 3 2 2 3 2 2 3 2 1 3 2 2 2 3 3 3 3 1 3 2
## [24733] 3 1 3 1 2 3 3 3 3 3 1 2 3 3 2 1 3 2 2 1 3 1 3 2 2 3 3 2 2 3 3 2 3 1 1 2
## [24769] 2 2 2 1 3 2 3 2 2 1 3 2 3 1 2 3 2 3 3 3 3 3 3 2 3 3 1 2 3 2 2 2 2 2 2 2
## [24805] 1 3 3 3 2 2 2 3 3 2 2 2 2 2 2 1 2 2 1 3 3 3 3 3 3 3 2 2 3 2 3 2 3 3 1 3
## [24841] 3 2 2 2 2 3 2 1 2 2 2 2 3 3 3 3 3 2 3 3 2 1 3 1 2 3 3 1 2 2 3 3 2 3 2 1
## [24877] 1 2 1 2 3 2 1 3 3 3 1 2 2 3 3 1 3 2 3 2 3 2 2 2 2 3 2 3 2 2 2 1 3 3 3 3
## [24913] 2 2 1 2 3 3 3 3 1 2 2 3 3 2 2 2 2 2 2 2 1 2 2 1 2 1 2 3 2 2 2 1 3 2 2 2
## [24949] 2 1 2 1 1 2 2 3 2 3 3 3 3 2 2 3 2 1 2 2 2 2 3 3 3 1 3 1 2 2 1 2 2 3 1 3
## [24985] 3 3 2 1 2 2 3 2 1 1 3 3 2 1 3 2 3 1 3 1 3 2 3 2 2 3 3 1 1 3 3 1 2 3 3 3
## [25021] 3 2 3 3 2 2 3 1 3 2 3 2 2 3 3 1 3 3 2 2 3 2 2 2 1 3 3 2 3 3 2 1 3 2 3 3
## [25057] 1 2 2 3 2 3 2 3 3 2 2 3 1 3 3 1 2 2 2 2 1 1 3 2 3 3 2 3 3 1 3 2 3 3 1 2
## [25093] 2 3 3 1 2 2 3 2 2 3 2 2 3 2 3 3 2 2 2 2 3 2 1 2 2 3 3 3 3 2 3 3 3 3 3 2
## [25129] 3 1 3 3 1 3 2 3 3 3 3 2 3 2 3 3 2 3 3 3 2 3 3 3 3 3 3 2 2 2 3 3 3 2 3 2
## [25165] 3 3 3 3 1 2 2 3 3 3 2 1 2 3 1 2 1 3 2 1 2 2 3 3 2 1 1 3 2 3 3 3 2 2 2 2
## [25201] 1 3 3 3 2 3 1 2 3 2 2 2 3 2 2 2 3 3 1 2 1 2 2 3 2 3 3 3 1 2 3 2 2 2 2 2
## [25237] 2 2 3 2 2 3 1 2 2 3 3 3 2 3 2 2 3 2 2 3 2 2 1 3 3 2 3 3 2 1 3 2 2 2 3 3
## [25273] 2 2 3 3 2 3 1 3 3 3 2 3 3 3 2 2 3 3 2 2 2 3 3 2 3 3 2 3 2 2 2 2 3 2 3 2
## [25309] 2 2 2 2 2 2 2 3 2 3 3 1 2 2 1 1 1 2 3 2 3 2 2 2 2 2 2 3 3 2 3 3 3 2 3 1
## [25345] 3 3 2 2 3 3 3 3 1 1 2 1 2 3 3 2 2 3 2 2 1 3 3 2 2 2 1 3 3 3 3 2 2 3 2 3
## [25381] 3 1 1 2 2 3 3 2 3 3 3 3 3 2 2 3 3 3 1 2 1 3 3 2 2 3 1 3 1 2 2 3 3 1 2 3
## [25417] 3 2 2 1 1 3 1 3 2 3 3 3 3 1 2 3 2 3 2 2 2 2 1 3 2 2 2 3 2 3 1 3 1 3 3 3
## [25453] 3 2 2 2 3 3 3 2 2 2 3 1 2 2 3 3 2 3 1 3 2 1 3 2 2 2 3 2 3 2 3 3 2 3 3 1
## [25489] 2 3 3 3 2 3 2 3 1 2 3 1 3 3 2 3 2 2 3 3 3 2 2 3 2 3 2 3 3 3 3 1 3 1 1 3
## [25525] 3 2 2 2 2 3 2 3 2 3 2 2 2 2 2 2 1 2 3 3 1 3 3 3 3 2 3 3 1 2 3 2 3 3 3 3
## [25561] 3 3 3 1 3 3 3 2 2 3 3 2 2 2 2 3 3 3 3 3 1 2 2 2 2 3 2 2 2 2 3 2 2 3 2 3
## [25597] 2 2 2 2 3 3 2 2 3 3 2 2 2 2 2 3 3 2 1 2 3 3 3 2 1 2 2 3 2 3 3 1 3 2 3 3
## [25633] 3 1 2 2 3 2 3 2 3 1 3 3 2 2 2 1 3 1 2 2 3 3 2 3 2 2 2 3 3 3 2 2 3 2 3 2
## [25669] 3 2 2 1 3 2 2 3 2 2 3 2 2 3 3 3 3 3 2 2 3 3 2 2 2 3 2 2 3 2 2 3 2 3 2 2
## [25705] 2 3 2 3 1 2 3 2 2 2 3 1 3 3 3 1 3 2 1 2 3 3 2 2 1 2 3 2 3 2 3 3 2 2 3 2
## [25741] 3 3 2 3 1 1 2 2 3 2 2 2 1 2 3 3 3 3 3 3 2 1 3 1 3 2 1 3 3 3 3 1 2 3 3 2
## [25777] 2 3 3 3 3 3 2 3 2 1 3 1 2 2 1 2 2 3 2 3 2 2 2 3 3 3 2 3 2 2 3 2 3 3 1 1
## [25813] 3 2 2 1 3 2 3 2 3 2 2 1 2 3 3 3 3 2 3 2 3 3 2 3 3 2 2 3 3 2 3 1 3 3 3 3
## [25849] 3 2 3 3 2 2 2 2 3 3 2 3 2 3 3 2 3 1 3 2 2 1 1 1 1 2 2 2 3 3 3 3 2 2 1 3
## [25885] 1 3 3 2 3 3 2 2 2 2 1 3 1 1 3 3 1 2 1 2 1 3 2 3 2 3 2 2 2 2 3 3 2 3 3 2
## [25921] 1 3 3 2 1 2 2 3 2 3 2 1 1 3 3 2 3 1 1 2 3 2 2 3 2 1 1 3 2 3 1 2 2 2 1 3
## [25957] 1 3 3 2 1 1 2 2 2 2 2 3 3 2 2 2 3 2 1 2 1 2 1 2 3 3 2 2 3 1 1 3 1 2 3 3
## [25993] 2 2 3 1 2 1 2 2 3 3 3 3 3 3 3 2 3 2 3 2 2 2 1 3 3 3 3 3 3 1 2 3 2 2 3 2
## [26029] 3 2 3 3 1 2 3 2 1 2 2 2 2 2 2 3 2 2 2 2 2 3 2 1 2 3 2 3 2 2 1 3 2 1 3 3
## [26065] 3 1 1 3 2 2 3 3 1 2 3 3 2 3 2 1 3 3 1 3 2 2 3 3 2 2 2 2 1 3 1 3 1 3 2 2
## [26101] 2 3 2 3 1 3 3 3 1 3 2 2 3 3 1 3 3 3 3 2 2 2 2 2 2 2 2 2 2 1 3 1 2 3 2 3
## [26137] 2 2 2 1 1 3 3 2 2 2 3 3 3 1 3 3 3 3 2 2 3 3 2 2 3 2 3 3 3 3 3 1 3 2 1 1
## [26173] 2 2 2 1 2 3 3 3 3 3 3 2 3 3 2 1 2 2 3 3 2 3 3 1 3 3 3 2 3 3 2 2 3 3 2 2
## [26209] 3 2 2 3 3 1 3 2 2 2 2 3 3 2 3 3 1 2 2 3 3 3 3 3 3 2 3 1 3 1 2 3 3 2 1 2
## [26245] 3 2 2 2 1 3 1 1 3 2 2 1 3 1 3 3 1 1 3 2 2 2 2 3 2 3 2 3 3 2 2 2 1 2 2 3
## [26281] 1 2 3 2 1 2 1 2 3 2 3 1 3 2 3 1 3 2 3 2 1 2 2 3 3 2 3 1 2 3 3 3 3 1 3 3
## [26317] 3 2 2 2 3 1 2 1 2 1 2 2 2 3 3 2 2 2 2 2 3 3 2 1 2 2 2 2 3 3 2 3 2 2 3 1
## [26353] 3 2 3 1 3 1 3 3 3 2 2 3 3 2 2 3 2 3 3 2 2 2 1 3 3 2 2 2 2 2 2 3 1 3 2 2
## [26389] 3 2 2 2 2 2 2 3 3 2 2 3 2 3 3 2 2 2 3 2 3 2 2 3 3 3 2 2 2 3 3 2 2 2 3 2
## [26425] 2 3 3 2 2 2 3 3 2 1 2 3 2 2 3 2 3 3 2 1 3 3 3 2 3 2 2 2 1 3 2 2 2 3 2 3
## [26461] 2 3 2 3 3 2 1 3 3 1 3 3 1 3 3 1 2 2 2 2 2 3 1 3 3 3 2 1 1 3 3 2 2 3 3 3
## [26497] 1 2 2 3 3 3 2 3 3 2 3 1 3 3 2 2 3 2 2 3 3 1 2 1 1 3 2 1 2 1 2 2 3 3 3 3
## [26533] 3 2 3 3 2 3 3 3 3 2 1 3 2 2 3 3 2 3 3 3 1 1 3 2 3 3 2 3 2 3 3 1 2 2 2 2
## [26569] 1 3 2 1 3 3 1 2 3 1 1 3 2 1 2 2 2 3 2 3 2 3 2 2 2 2 3 1 2 3 3 2 2 1 1 3
## [26605] 3 2 3 2 3 2 3 2 3 1 3 2 3 3 2 3 2 3 2 2 3 3 2 2 3 3 2 3 3 2 3 3 1 2 3 2
## [26641] 1 3 3 3 2 1 2 3 3 2 2 1 1 2 3 3 2 1 2 3 3 2 3 2 2 3 2 2 2 2 3 3 3 2 3 2
## [26677] 3 3 2 2 2 3 1 3 2 2 1 3 2 2 2 1 3 3 2 3 2 2 1 3 3 3 2 3 1 3 1 1 3 1 1 3
## [26713] 3 3 2 1 2 2 2 1 1 3 3 3 2 2 2 3 1 3 2 3 3 3 2 2 3 1 2 2 3 3 3 1 2 3 2 2
## [26749] 3 2 2 3 3 2 2 3 1 1 3 3 2 3 3 3 3 3 3 1 2 3 1 1 2 2 3 2 2 3 3 2 3 2 2 1
## [26785] 1 3 2 2 3 2 3 3 3 1 2 2 3 3 1 1 2 2 2 3 3 3 3 2 2 2 3 3 2 2 3 1 2 2 3 1
## [26821] 3 2 1 2 1 1 2 2 3 2 1 2 1 3 3 3 2 2 1 1 1 1 2 3 2 3 3 3 3 3 3 2 2 2 2 2
## [26857] 2 3 3 2 3 2 2 2 1 1 3 2 2 1 2 2 1 3 3 2 3 1 2 2 3 2 3 2 3 2 3 2 3 1 2 2
## [26893] 3 3 2 3 2 3 3 2 2 2 2 2 2 1 3 3 2 3 3 3 2 2 3 2 2 2 2 3 3 2 1 2 3 1 3 2
## [26929] 2 3 3 2 3 2 1 2 3 1 2 2 2 1 3 3 1 2 1 2 3 2 3 2 2 2 1 3 2 3 3 3 2 2 1 2
## [26965] 1 3 3 2 3 2 2 1 2 2 2 3 3 3 2 2 3 3 2 2 3 1 3 2 2 3 2 2 3 2 3 1 2 1 1 2
## [27001] 2 3 3 2 1 3 3 1 3 2 2 3 2 3 3 3 3 3 3 2 2 3 2 1 3 2 2 2 2 3 3 2 2 2 3 2
## [27037] 3 2 2 2 3 3 3 2 3 2 2 1 1 3 2 1 1 2 1 2 2 3 2 3 2 3 1 3 3 1 2 2 2 3 3 3
## [27073] 2 3 1 2 2 3 1 3 1 2 2 2 3 2 3 2 3 2 2 2 2 1 2 1 2 2 3 3 2 2 3 2 2 3 3 2
## [27109] 3 2 2 1 2 2 2 2 1 2 3 3 3 2 1 3 2 2 2 2 1 2 3 3 2 3 3 3 3 3 2 1 2 3 1 3
## [27145] 2 2 1 2 3 2 2 3 2 2 2 2 2 3 3 3 2 2 3 3 2 2 3 3 1 3 1 3 2 3 2 3 1 3 1 2
## [27181] 2 3 2 3 3 1 2 3 2 2 3 2 2 3 2 3 3 2 2 2 1 3 3 2 2 3 3 3 3 3 1 2 3 2 2 1
## [27217] 3 3 1 3 3 2 2 3 2 2 1 1 3 2 3 3 3 1 3 3 2 2 2 2 2 2 1 2 3 3 1 3 2 2 2 2
## [27253] 2 2 2 2 3 1 3 1 3 2 2 2 2 2 2 3 2 3 3 2 3 2 2 3 2 2 2 2 1 3 2 2 3 3 1 3
## [27289] 1 3 2 3 2 2 3 2 2 3 3 2 2 2 3 2 2 2 2 2 1 2 1 2 3 1 2 3 3 2 2 2 2 3 2 2
## [27325] 3 2 2 3 2 3 3 1 3 3 3 2 3 3 3 1 2 3 2 3 1 3 3 2 2 3 3 3 2 2 3 1 3 3 3 3
## [27361] 2 2 2 3 2 1 3 1 2 2 1 2 2 3 3 2 1 3 2 2 3 3 2 2 2 2 3 3 3 3 1 1 2 3 2 3
## [27397] 3 1 3 2 3 1 2 2 2 2 2 3 2 3 3 2 2 3 3 3 2 2 1 3 2 1 1 3 2 2 2 2 3 1 3 3
## [27433] 3 3 2 1 1 1 2 3 2 2 3 2 2 2 2 2 3 1 3 2 1 1 3 3 2 3 2 2 1 2 2 1 2 3 1 2
## [27469] 2 1 1 2 3 2 2 3 2 1 3 3 3 3 2 2 3 1 3 2 2 1 3 3 3 3 1 3 1 3 1 2 2 2 1 2
## [27505] 3 3 1 2 2 2 2 1 3 1 2 2 2 3 1 3 2 2 2 2 3 2 2 3 3 2 1 2 3 3 2 3 3 1 2 3
## [27541] 2 2 2 2 3 3 2 2 2 3 3 3 3 1 2 2 3 3 2 3 3 1 2 3 3 1 3 3 3 1 3 3 2 2 3 1
## [27577] 3 2 1 2 1 3 3 3 3 2 2 3 2 1 2 2 3 3 2 2 1 3 2 2 2 2 3 2 2 2 2 2 3 1 2 1
## [27613] 2 2 3 3 2 3 2 2 1 3 2 3 1 3 2 1 2 2 1 1 3 2 2 3 2 3 2 2 3 2 3 1 2 3 1 3
## [27649] 2 3 2 2 2 1 3 2 2 2 2 2 2 1 2 3 2 3 3 3 3 1 3 3 1 2 2 3 2 3 1 3 2 3 3 3
## [27685] 2 3 3 3 2 3 3 2 3 3 3 3 2 3 3 2 1 2 1 3 1 2 1
## 
## Within cluster sum of squares by cluster:
## [1] 137461896 135506465 171579035
##  (between_SS / total_SS =  68.9 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
k <- 3
set.seed(123)
kmean_out <- kmeans(train.hotel3_columns, centers = k, nstart = 20)
library(ggplot2)
train.hotel3_columns$Cluster_ID <- factor(kmean_out$cluster)
ggplot(train.hotel3_columns, aes(RatePerNight, TotalRevenue, color = Cluster_ID)) +
    geom_point(alpha = 0.25) +
    xlab("RatePerNight") +
    ylab("TotalRevenue")

print(kmeans_out$centers)
##   AverageLeadTime PersonsNights RoomNights RatePerNight OtherRevenue
## 1        76.54164      8.110692   3.916981     187.9975    101.61276
## 2        57.74327      3.223787   1.827938     101.9453     30.49785
## 3        83.58580      6.472522   3.309896     117.8939     73.33603
##   TotalRevenue
## 1     741.1210
## 2     200.1372
## 3     429.3238
kmeans_out$withinss
## [1] 137461896 135506465 171579035
library(cluster)
data <- as.data.frame(train.hotel3_columns)

str(data)
## 'data.frame':    27707 obs. of  7 variables:
##  $ AverageLeadTime: num  38 214 30 0 2 16 8 34 3 33 ...
##  $ PersonsNights  : num  6 8 6 8 1 9 3 2 4 6 ...
##  $ RoomNights     : num  3 4 3 4 1 3 3 1 2 2 ...
##  $ RatePerNight   : num  68.1 84.8 141 97.5 134 ...
##  $ OtherRevenue   : num  9.5 12.5 99 8 3.5 77 21 106 28 62 ...
##  $ TotalRevenue   : num  214 352 522 398 138 ...
##  $ Cluster_ID     : Factor w/ 3 levels "1","2","3": 2 3 3 3 2 1 1 3 3 2 ...
##  - attr(*, "na.action")= 'omit' Named int [1:3598] 77 89 100 114 133 180 186 242 273 283 ...
##   ..- attr(*, "names")= chr [1:3598] "77" "89" "100" "114" ...
silhouette_score <- silhouette(kmeans_out$cluster, dist(data), metric = "euclidean")

mean_silhouette <- mean(silhouette_score[, "sil_width"])
print(mean_silhouette)
## [1] 0.3878587

The mean silhouette width is a measure of how well-separated clusters are. A value closer to 1 indicates well-defined and appropriately separated clusters, while a value close to 0 suggests overlapping or poorly separated clusters.

A mean silhouette width of 0.3831 is relatively good. It indicates that, on average, the objects within each cluster are closer to each other than to objects in other clusters. This suggests that the clustering has captured meaningful patterns in the data.

**

#library(caret)
#tuneGrid <- expand.grid(k = seq(1, 13, by = 2))

# Set seed for reproducibility
#set.seed(1)

# Train k-NN regression model
#knn_reg_fit <- train(
#  TotalRevenue ~ AverageLeadTime + PersonsNights + RoomNights + RatePerNight + OtherRevenue + DistributionChannel + MarketSegmentCombined,
#  data = train.hotel3,
#  method = "knn",
#  preProcess = c('center', 'scale'),
#  trControl = trainControl(method = 'repeatedcv', number = 10, repeats = 5),
#  tuneGrid = tuneGrid
#)
#knn_reg_fit
#plot(knn_reg_fit)
#library(ggplot2)

# Plotting RMSE vs. k
#ggplot(knn_reg_fit, aes(x = k, y = RMSE)) +
#  geom_point() +
#  geom_line() +
#  labs(title = "RMSE vs. k in k-NN Regression",
 #      x = "k",
#       y = "Root Mean Squared Error") +
#  scale_x_continuous(breaks = seq(1, 59, by = 2))
#library(ggplot2)

# Plotting RMSE vs. k
#ggplot(knn_reg_fit, aes(x = k, y = RMSE)) +
#  geom_point() +
#  geom_line() +
#  labs(title = "RMSE vs. k in k-NN Regression",
#       x = "k",
#      y = "Root Mean Squared Error") +
#  scale_x_continuous(breaks = seq(1, 59, by = 2)) +
#  theme_minimal() 
#  theme(axis.line = element_line(color = "black"),  # Add black border to x and y axes
#        panel.border = element_rect(color = "black", fill = NA))  # Add border around the plot area
library(caret)
## Loading required package: lattice
library(pROC)
## Type 'citation("pROC")' for a citation.
## 
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
install.packages("mlbench")
## 
## The downloaded binary packages are in
##  /var/folders/q6/vr1t5vmx405cg6xfgtcl3np80000gn/T//RtmpmCK8A5/downloaded_packages
library(mlbench)
#predictions_1 <- knn_reg_fit %>% predict(valid.hotel3)
#head(predictions_1)
# Create a data frame with actual, predicted, and residuals for the validation data
#vl.res_knn <- data.frame(valid.hotel3$TotalRevenue, predictions_1, residuals = 
#                       valid.hotel3$TotalRevenue - predictions_1)
#head(vl.res_knn)
#SE <- mean(predictions_1 - valid.hotel3$TotalRevenue)
#SE
#RMSE(predictions_1,valid.hotel3$TotalRevenue)
# Mean Absolute Error (MAE)
#MAE_value <- mean(abs(predictions_1 - valid.hotel3$TotalRevenue))
#MAE_value
# Mean Percentage Error (MPE)
#MPE_value <- mean((valid.hotel3$TotalRevenue - predictions_1) / valid.hotel3$TotalRevenue) * 100
#MPE_value
# Mean Absolute Percentage Error (MAPE)
#MAPE_value <- mean(abs((valid.hotel3$TotalRevenue - predictions_1) / valid.hotel3$TotalRevenue)) * 100
#MAPE_value

KNN Regression

#plot(predictions_1 ~ valid.hotel3$TotalRevenue)
#plot(predictions_1 ~ valid.hotel3$TotalRevenue, col = "lightblue", pch = 16,
#     xlab = "Actual TotalRevenue", ylab = "Predicted TotalRevenue",
#     main = "K-NN: Scatter Plot of Predicted vs Actual TotalRevenue ")

# Add a diagonal line for reference
#abline(0, 1, col = "red", lty = 2)

# Add labels and legend if needed
#legend("bottomright", legend = c("Predictions", "Reference Line"),
#       col = c("lightblue", "red"), pch = c(16, NA), lty = c(NA, 2))

MLR

#plot(pred_v ~ valid.hotel3$TotalRevenue)
#plot(pred_v ~ valid.hotel3$TotalRevenue, col = "lightblue", pch = 16,
#     xlab = "Actual TotalRevenue", ylab = "Predicted TotalRevenue",
#     main = "MLR: Scatter Plot of Predicted vs Actual TotalRevenue ")

# Add a diagonal line for reference
#abline(0, 1, col = "red", lty = 2)

# Add labels and legend if needed
#legend("bottomright", legend = c("Predictions", "Reference Line"),
#       col = c("lightblue", "red"), pch = c(16, NA), lty = c(NA, 2))
#new_data <- data.frame(
#  AverageLeadTime = 30,  # Replace with actual values
#  PersonsNights = 1,
#  RoomNights = 1,
 # RatePerNight = 80,
 # OtherRevenue = 40,
 # DistributionChannel = "Electronic Distribution", 
 # MarketSegmentCombined = "Groups" 
#)

# Predict TotalRevenue using the trained model
#predictions <- predict(knn_reg_fit, newdata = new_data)

# View the predicted TotalRevenue
#print(predictions)
#new_data <- data.frame(
#  AverageLeadTime = 30, 
#  PersonsNights = 1,
#  RoomNights = 1,
#  RatePerNight = 80,
#  OtherRevenue = 40,
#  DistributionChannel = "Travel Agent/Operator", 
#  MarketSegmentCombined = "Other_Complementary" 
#)

# Predict TotalRevenue using the trained model
#predictions <- predict(knn_reg_fit, newdata = new_data)

# The predicted TotalRevenue
#print(predictions)
#new_data <- data.frame(
#  AverageLeadTime = 30, 
#  PersonsNights = 1,
#  RoomNights = 1,
#  RatePerNight = 80,
#  OtherRevenue = 40,
#  DistributionChannel = "Electronic Distribution", 
#  MarketSegmentCombined = "Other_Complementary" 
#)

# Predict TotalRevenue using the trained model
#predictions <- predict(knn_reg_fit, newdata = new_data)

# The predicted TotalRevenue
#print(predictions)
#new_data <- data.frame(
#  AverageLeadTime = 30,  # Replace with actual values
#  PersonsNights = 1,
 # RoomNights = 1,
 # RatePerNight = 80,
 # OtherRevenue = 40,
#  DistributionChannel = "Direct", 
#  MarketSegmentCombined = "Direct" 
#)

# Predict TotalRevenue using the trained model
#predictions <- predict(knn_reg_fit, newdata = new_data)

# View the predicted TotalRevenue
#print(predictions)

References

https://www.youtube.com/watch?v=tSPg-JDAF4M

KNN Regression https://www.youtube.com/watch?v=tFnLSS4EVTA

https://www.youtube.com/watch?v=7YjsKh1kc7M